RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 704038
Accepted
wololo
wololo
Asked:2020-08-09 22:26:23 +0000 UTC2020-08-09 22:26:23 +0000 UTC 2020-08-09 22:26:23 +0000 UTC

在 C++ 中将 double 转换为浮点数

  • 772

让类型变量double转换为类型变量float。如果变量double包含一个值NaN,则将其转换为NaN。如果变量double包含一个值Inf,则将其转换为Inf。如果变量double包含一个值-1e+50,则将其转换为-Inf。

这种行为是由 C++ 标准保证的,还是IEEE 754保证的?或者它是实现定义的行为,还是通常未定义的行为,一般来说不值得指望-1e+50转换-Inf为什么?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    ixSci
    2020-08-09T22:55:07Z2020-08-09T22:55:07Z

    严格来说,标准没有定义 和 的维度float,double但在我的回答中,我会假设它们具有不同的维度,分别代表 32 位和 64 位数据类型。

    因为 float可以容纳从±1.18×10^(−38) 到 ±3.4×10^38的数字,并且您尝试将其放入变量float中,该变量的double值无法精确表示的类型float,您会得到-inf. 你会得到未定义的行为。-inf因此,不值得期待。

    我最初的回答是说你得到了未定义的行为,这是不正确的。如果我们试图适应float一个无法在其中表示的数字,则会导致未定义的行为。以下是标准中的描述:

    C++14 标准[conv.double]

    浮点类型的纯右值可以转换为另一种浮点类型的纯右值。如果源值可以在目标类型中精确表示,则转换的结果就是该精确表示。如果源值介于两个相邻的目标值之间,则转换的结果是实现定义的对这些值中的任何一个的选择。否则,行为未定义。

    但这都是关于抽象实现的,我们有它非常具体(这是我的错误——我尝试了一个具体的实现来进行抽象描述并得出了错误的结论)。由于我对有效值的范围做出了假设float,所以我采用了一个特定的实现——IEEE 754。既然我采用了这个实现,那么我需要从它开始,而不是从抽象开始。

    根据 IEEE 754,无穷大是类型的一部分,因此它的最大值和最小值不是它的分隔符。只是根据舍入规则将允许范围之外的所有内容减少到所需的值。所以,根据这条规则,如果你尝试用 表示-1e+50,float那么它会变成-INF- 这是一个正常值float,并且当std::numeric_limits<float>::is_iec559等于true* 时保证它。那些。我们从标准中得到了这种情况:“源值在两个相邻的目标值之间,转换的结果是实现定义的对这些值中的任何一个的选择”。

    如果上述常数等于false,那么问题的答案可能会有所不同,但也应该在具体实现的框架内考虑,因为 我们在问题中有一个具体的数字,如果没有实施方面的具体细节,我们无法考虑。

    总结一下:这种行为是否是未定义的行为,是否依赖于实现——这一切都取决于浮点类型的表示,不能在它之外考虑。

    * 我没有找到文件本身的文字,但许多引用它的文件都说明了这一点。


    顺便说一句,在 C 中,这更明确地说明:如果环境支持无穷大,则定义结果,并通过问题中的示例给出保证-inf。这在 C11 标准[5.2.4.2.2/p5]中有所描述

    浮点类型的可表示值的最小范围是该类型中可表示的最负的有限浮点数通过该类型中可表示的最正的有限浮点数。此外,如果负无穷大在一个类型中是可表示的,则该类型的范围扩展到所有负实数;同样,如果一个类型可以表示正无穷大,则该类型的范围扩展到所有正实数。

    • 8

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5