【发布时间】:2014-01-23 14:41:04
【问题描述】:
C 和 C++ 标准是否要求在 math.h 中对浮点数进行数学运算(即 sqrt、exp、log、sin、...)以返回数值最佳解?
对于给定的(准确且有效的)输入,显然这些函数通常不会有准确的浮点输出。但是输出是否需要是最接近数学精确值的可表示值?
如果没有,是否对精度有任何要求(可能是特定于平台的/在其他标准中?),以便我能够对代码中的计算错误做出最坏情况的估计?现代实现的数值误差的典型限制是什么?
【问题讨论】:
-
基本没有。 IEEE-754 甚至没有指定其中的大部分。可表示的位数有一些限制,但曾经有一段时间,不稳定的专有浮点实现激增,结果该语言没有指定浮点结果的大部分内容。毕竟是C精神
-
@doynax: +1 实现甚至不需要遵循 IEEE 754 浮点/双精度规范。
-
@doynax:你是什么意思 IEEE 754 没有指定其中的大部分? IEEE 754-2008 表 9.1 推荐
exp、log、sin等。 -
@EricPostpischil:看来我已经过时了,只阅读了 IEEE 754-1985。从对 2008 年修订版的粗略阅读看来,这些函数的准确性似乎没有明确,除了一些身份和奇怪的要求,即当且仅当它们不精确时才发出不精确的结果。这似乎处理起来不必要的昂贵。除了指数函数之外,肯定没有人会期待超越函数的确切结果?
-
@doynax:第 9.2 节,表格出现的地方,说函数应该正确四舍五入。这意味着考虑到舍入模式和格式,误差必须尽可能小;在四舍五入模式中,必须返回最接近的可表示值(打破常规规则)。我同意,这些结果通常不应被期望,除非那些已被证明是可行的(如CRlibm project。见我对MSalter’s answer的评论;这是在委员会后更改的。
标签: c++ c floating-point math.h