对于某些正整数n,m,will(int)pow(n,m)是错误的吗?

use*_*366 5 c floating-accuracy

假定nm是正整数,且n 是一个整数的范围内,将(int)pow(n,m)永远给一个错误的答案?

我已经尝试了许多nm=2,并没有得到任何错误的答案为止.

ric*_*ici 8

C标准对浮点运算的精度没有任何要求.准确性是实现定义的,这意味着需要实现来记录它.然而,实现留下了重要的"结果":(§5.2.4.2.2第6段,重点增加.)

的浮点运算(的准确性+,-,*,/)的库中的功能和<math.h><complex.h>该返回浮点结果是实现定义的一样,是转换由执行浮点内部表示与字符串表示之间的准确度在库函数<stdio.h>,<stdlib.h><wchar.h>.实施可能表明准确性未知.

事实上,gcc通过指定准确性未知来利用这一点.尽管如此,即使没有保证,glibc计算的准确性也相当不错.

已知MS libc实现偶尔会为pow具有整数参数的函数产生1ULP的错误,如果pow操作的结果被简单地截断为a,则会导致错误的值int.(我在Visual Studio文档中找不到有关浮点精度的任何规范,但我相信下面的SO问题列表提供了我断言的证据.)

在x86体系结构中,大多数实现都尝试实现IEEE 754,因为本机浮点表示符合.然而,直到2008年修订版,IEEE-754仅需要从正确的舍入结果+,-,*,/sqrt.自修订以来,它建议许多其他函数返回正确的舍入结果,但所有这些建议都是可选的,并且很少有数学库实现所有这些.

如果你真的想用来pow计算整数的整数幂,那么建议(而且很容易)使用lround(pow(n, m))而不是(long)(pow(n, m))将结果四舍五入到最接近的整数,而不是乐观地依赖于误差为正.如果在1ULP范围内,那么应该为结果提供正确的整数值,最多为2 52(使用IEEE-754双精度)pow.在2 52和2 53之间,1ULP误差为0.5,有时会舍入到错误的整数.超过2 53并非所有整数都可以表示为双精度.

因此,这个问题实际上充满了问题.看到:

毫无疑问,还有更多.