gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:53:59 26 4
gpt4 key购买 nike

假设nm为正整数,且nm在整数范围内,将(int) pow(n,m) 曾经给出错误的答案吗?

我已经为 m=2 尝试了很多次 n 并且到目前为止还没有得到任何错误的答案。

最佳答案

C 标准对浮点运算的精度没有任何要求。准确性是实现定义的,这意味着需要实现来记录它。然而,实现留下了一个重要的“out”:(§5.2.4.2.2 第 6 段,强调已添加。)

The accuracy of the floating-point operations (+, -, *, /) and of the library functions in <math.h> and <complex.h> that return floating-point results is implementation-defined, as is the accuracy of the conversion between floating-point internal representations and string representations performed by the library functions in <stdio.h>, <stdlib.h>, and <wchar.h>. The implementation may state that the accuracy is unknown.

事实上,gcc 通过指定 the accuracy is unknown 来利用这一点.尽管如此,glibc 计算的准确性非常好,即使不能保证。

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

在 x86 架构上,大多数实现都会尝试实现 IEEE 754,因为 native 浮点表示符合标准。然而,在 2008 年修订版之前,IEEE-754 只需要来自 + 的正确舍入结果。 , - , * , /sqrt .自修订以来,it recommends许多其他函数返回正确舍入的结果,但所有这些建议都是可选的,很少有数学库实现所有这些建议。

如果你真的想用pow要计算整数的整数次幂,建议(并且容易)使用 lround(pow(n, m))而不是 (long)(pow(n, m)) ,这会将结果四舍五入为最接近的整数,而不是乐观地依赖误差为正。如果pow,那应该为最多 252(IEEE-754 double )的结果提供正确的整数值。在 1ULP 以内。在 252 和 253 之间,1ULP 误差为 0.5,有时会四舍五入为错误的整数。超过 253 并非所有整数都可以表示为 double 值。

SO 实际上充满了由这个特定问题引起的问题。见:

毫无疑问还有更多。

关于c - (int)pow(n,m) 对于某些正整数 n,m 会是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32353301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com