【问题标题】:IEEE Std 754 Floating-Point: let t := a - b, does the standard guarantee that a == b + t?IEEE Std 754 浮点:让 t := a - b,标准是否保证 a == b + t?
【发布时间】:2012-05-29 00:51:07
【问题描述】:

假设 t,a,b 都是双精度(IEEE 标准 754)变量,并且 ab 的两个值都不是 NaN(但可能是 Inf) . 在t = a - b之后,我一定有a == b + t吗?

【问题讨论】:

  • 我相信下溢的结果将是未定义的,第二个表达式中的溢出也是如此,所以没有。如果有人能证实这一点,那就太好了。
  • 啊,我猜这种确认溢出对于浮点也是未定义的:As with any other arithmetic overflow, if the result does not fit in the space provided, the behavior is undefined.
  • 在符合 IEEE 754 的 C 实现中,没有用于任何浮点运算的 UB。所有结果都经过严格定义。
  • 如果 a=b=Inf 然后 t=NaN 并且第二个等式失败。您可能会找到另一个使用负零的示例。
  • @RaymondChen:负零也是一个很好的例子,但是对于一些不那么晦涩的情况,请参阅我的答案......

标签: c++ c floating-point ieee-754


【解决方案1】:

绝对不是。一个明显的例子是a=DBL_MAXb=-DBL_MAX。那么t=INFINITY,所以b+t也是INFINITY

可能更令人惊讶的是,在某些情况下会发生这种情况而没有任何溢出。基本上,它们都是a-b 不精确的形式。例如,如果aDBL_EPSILON/4 并且b-1,则a-b 是1(假设默认舍入模式),那么a-b+b 是0。

我提到第二个示例的原因是,这是在 IEEE 算术中强制舍入到特定精度的规范方法。例如,如果您有一个在 [0,1) 范围内的数字,并且想要强制将其四舍五入到 4 位精度,您可以先加上然后减去 0x1p49

【讨论】:

  • 第二个例子很棒,因为它不会产生 Inf 或 NaN。非常感谢。
  • 您可能想澄清0x1p49 常量,我上次查看的十六进制数字从 0 到 F ;)
  • @MSalters:“0x1p49”是十六进制浮点数,如 C 标准中所定义。格式为“0x”“p”,其中为十六进制数字,可选包含句点,为十进制数字,可选包含符号。指数的底数是 2,所以 0x1p49 是 249。 0x1p-4 为 1/16,0x1.23p8 为 (1 + 2/16 + 3/256) * 28 = 291。十六进制浮点提供了一种易于人类和编译器使用的格式在没有舍入问题的情况下与二进制浮点编码相互转换。
【解决方案2】:

在执行第一个操作的过程中,结果的低端可能会丢失位。所以一个问题是,第二次操作会完全重现这些损失吗?我还没有完全考虑清楚。

但是,当然,第一个操作可能会溢出到 +/-infinity,导致第二个比较不相等。

(当然,在一般情况下,将== 用于浮点值几乎总是一个错误。)

【讨论】:

  • 仅仅通过计数参数,第二次操作并不能把丢失的东西带回来。如果可以的话,您在t 中存储的信息位数将超过t 中的位数...
  • @R -- 是的。直觉上人们知道它不会起作用,因为你所说的,但是找到例子比诉诸一个深奥的规则更好的“证据”,无论多么有效。
【解决方案3】:

使用浮点数时,您无法得到任何保证。如果两个数字的指数不同,则算术运算的结果可能无法完全用浮点数表示。

考虑这段代码:

float a = 0.003f;
float b = 10000000.0f;
float t = a - b;
float x = b + t;

在 Visual Studio 2010 上运行,您会得到 t==-10000000.0f,因此会得到 x==0

在比较浮点数时永远不要使用相等。而是比较两个值之间差异的绝对值和一个足够小的满足您的精度需求的 epsilon 值。

它变得更加奇怪,因为不同的浮点实现可能会为相同的操作返回不同的结果。

【讨论】:

  • 我从不喜欢“比较差异的绝对值”的建议。有可能获得错误界限(What Every Computer Scientist Should Know About Floating-Point Arithmetic 是一个好的开始),并且在盲目切换到某个任意界限之前,应该考虑通过比较尝试完成什么。
  • 使用 IEEE-754 浮点数可以保证很多事情。这恰好不是其中之一。
  • 使用 IEEE 浮点数有很多保证,有时比较相等性不仅合理,而且必不可少。浮点数学绝对是棘手的,但它不是随机的或恶意的。这是我的博客中关于何时测试浮点相等性至关重要的示例:randomascii.wordpress.com/2014/01/27/…
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 2022-10-13
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多