在C++中,static_cast<float>(some_double_variable)的标准行为是什么?

问题描述 投票:0回答:1

除了精度损失之外,当双精度型转换为浮点数时还必须发生某种特殊的转换行为(例如夹紧等)。我试图找到C++标准文档,以及Linux上g++编译器的源代码,但我没有运气。我注意到 Windows 上的转换行为与 Linux 上的相同;该应用程序在两个操作系统上给出相同的结果。

任何见解将不胜感激。感谢您的宝贵时间。

我尝试进行手动夹紧,但没有得到我想要的结果。

c++ static-cast
1个回答
0
投票

标准的

[conv.double]
部分描述了相关行为:

...标准浮点类型的纯右值可以转换为另一个标准浮点类型的纯右值。

2 如果源值可以在目标类型中精确表示,则转换的结果就是该精确表示。如果源值位于两个相邻的目标值之间,则转换的结果是实现定义的对其中任一值的选择。否则,行为是未定义的。

float
double
(以及
long double
,FWIW)都是“标准浮点类型”,因此上述内容适用。当进行从
double
float
的缩小转换时,许多
double
值不会 “在目标类型” 中准确表示,因此 “如果源值位于两个相邻目标值之间 [实现选择一个]" 启动,当双精度值不在两个可表示的浮点值之间时,将这种情况保留为未定义的行为。这基本上意味着绝对值太大的值会产生未定义的行为。

当然,对于标准未定义的情况,实现可以提供实现定义的行为(就像 POSIX 提供浮点除以 0 的 NaN 结果,而标准未定义)。

© www.soinside.com 2019 - 2024. All rights reserved.