除了精度损失之外,当双精度型转换为浮点数时还必须发生某种特殊的转换行为(例如夹紧等)。我试图找到C++标准文档,以及Linux上g++编译器的源代码,但我没有运气。我注意到 Windows 上的转换行为与 Linux 上的相同;该应用程序在两个操作系统上给出相同的结果。
任何见解将不胜感激。感谢您的宝贵时间。
我尝试进行手动夹紧,但没有得到我想要的结果。
[conv.double]
部分描述了相关行为:
...标准浮点类型的纯右值可以转换为另一个标准浮点类型的纯右值。
2 如果源值可以在目标类型中精确表示,则转换的结果就是该精确表示。如果源值位于两个相邻的目标值之间,则转换的结果是实现定义的对其中任一值的选择。否则,行为是未定义的。
float
和double
(以及long double
,FWIW)都是“标准浮点类型”,因此上述内容适用。当进行从 double
到 float
的缩小转换时,许多 double
值不会 “在目标类型” 中准确表示,因此 “如果源值位于两个相邻目标值之间 [实现选择一个]" 启动,当双精度值不在两个可表示的浮点值之间时,将这种情况保留为未定义的行为。这基本上意味着绝对值太大的值会产生未定义的行为。
当然,对于标准未定义的情况,实现可以提供实现定义的行为(就像 POSIX 提供浮点除以 0 的 NaN 结果,而标准未定义)。