首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++铸成一个更精确的类型,并失去准确性?

C++铸成一个更精确的类型,并失去准确性?
EN

Stack Overflow用户
提问于 2012-05-27 16:04:59
回答 2查看 418关注 0票数 3

考虑两种计算方法:

双精度

  1. 数据

->应用双精度时序函数

双精度->返回结果

  • 数据

->铸成长双

->应用长双精度时序函数

->铸成双倍

->返回结果

第二个解能给出一个比第一个更不准确的结果吗?如果是的话,在什么情况下?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

票数 5
EN

Stack Overflow用户

发布于 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 doubledouble时感兴趣的地方。

4.8浮点转换

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

2允许作为浮点提升的转换被排除在浮点转换集合之外。

现在,让我们看看缩小范围的效果

6.缩窄转换是隐式转换。

..。

  • 从长双到双或浮动,或从双到浮点,除非源是一个常量表达式,并且转换后的实际值在可以表示的值范围内(即使不能准确表示)

所有这些标准有两种外卖方式:

  • 将缩小和实现定义的转换结合起来,您的结果可能会发生跨平台的变化。如果您在double.

中的中间结果(考虑多个这样的结果)处于一个不能被double (高或低)精确表示的范围内,则这些结果可以累加以返回不同的最终结果,而您希望返回该结果为一个

至于哪个更准确,我认为这完全取决于你的申请。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10775361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档