考虑两种计算方法:
双精度
->应用双精度时序函数
双精度->返回结果
->铸成长双
->应用长双精度时序函数
->铸成双倍
->返回结果
第二个解能给出一个比第一个更不准确的结果吗?如果是的话,在什么情况下?
发布于 2012-05-28 00:06:47
是。证明:让c= 0x1p-53 + 0x1p-64。评估1+c-c-1的双倍和长双(通常的英特尔格式,64位意义).在双倍中,结果是0,这是数学上精确的答案。在long double中,结果是-0x1p-64,这是错误的(当转换为双倍时仍然是错误的)。
在double中,1+c将ULP (最小精度单位)的一半加在1到1之间,因此它产生1+一个ULP。减去c略大于ULP的一半,因此最接近可表示的数字(以双单位表示)为1,因此产生了1。然后减去1得到0。
在long double中,1+c将0x1p-53加上半个ULP为1 (在long double中,ULP为0x1p-63)。由于结果与两个最近可表示的数字(长双)的距离完全相同,因此返回低比特零的1+0x1p-53。那么减去c的确切结果是1-0x1p-64。这是完全可表示的,所以它被返回。最后,减去1收益率-0x1p-64。
发布于 2012-05-27 16:53:25
关于long double,草案说:
3.9.1基本类型
8有三种浮点类型:浮点数、双浮点数和长浮点数。类型double提供的精度至少与浮点数一样高,而long double提供的精度至少与双精度相同。类型float的值集是类型double的值集的子集;类型double的值集是long double类型的值集的子集。浮点类型的值表示是实现定义的.整数和浮点类型统称为算术类型。标准模板std::numeric_limits (18.3)的专门化应指定实现的每种算术类型的最大值和最小值。
至于促销,接下来最有趣的一点是:
4.6浮点推广
1类型浮动的prvalue可以转换为类型的prvalue。值不变。
2这种转换称为浮点提升。
注意,关于double to long double,没有什么可说的。不过,我敢冒险说这是个失误。
接下来是转换,这是我们在从long double到double时感兴趣的地方。
4.8浮点转换
1浮点类型的prvalue可以转换为另一个浮点类型的值。如果源值可以精确地在目标类型中表示,则转换的结果是准确的表示。如果源值位于两个相邻的目标值之间,则转换的结果是实现定义的对其中任何一个值的选择。否则,行为是未定义的。
2允许作为浮点提升的转换被排除在浮点转换集合之外。
现在,让我们看看缩小范围的效果
6.缩窄转换是隐式转换。
..。
所有这些标准有两种外卖方式:
double.中的中间结果(考虑多个这样的结果)处于一个不能被double (高或低)精确表示的范围内,则这些结果可以累加以返回不同的最终结果,而您希望返回该结果为一个
至于哪个更准确,我认为这完全取决于你的申请。
https://stackoverflow.com/questions/10775361
复制相似问题