c - C中 pow 的精度是否取决于参数的比例?
问题描述
我要维护的旧代码具有一个带有双精度类型变量 x 的函数。此变量包含以米为单位的位置。预计将保持毫米范围内的值,例如 0.0001 < x < 0.01。
然后我注意到代码中有这样的注释:
// We will take the 6th power of this variable.
// Convert number to mm to get better accuracy.
x /= 1.0e-3;
double y = pow(x, 6.0);
- 这有意义吗,当第一个参数是 1 的数量级时, pow() 的精度确实更好吗?考虑到我认为浮点数的工作方式,我不认为尾数的大小很重要,只要一个没有达到极限。
- 是否也应该缩小大于 1 的参数?
- 额外问题:第二个参数(功率)的值会影响精度吗?即,较高的功率是否比小功率更不准确?
目标平台是 x86_64 的 Linux 3.10.x,我们使用 GCC 编译器版本 4.9.3。
我尝试了一个小测试程序,当使用比 1 大得多或小得多的参数时,它确实显示出更大(但仍然不是很显着)的错误,但这也可能是由输入和/或结果的表示方式引起的浮点数字?
#include <stdio.h>
#include <math.h>
void printpow(double d)
{
double pow6 = pow(d, 6.0);
printf("% 8g ^ 6 = %.20g\n", d, pow6);
}
int main(int argc, char **argv)
{
printpow(7.0e-10);
printpow(7.0e-6);
printpow(7.0e-3);
printpow(7.0);
printpow(7.0e3);
printpow(7.0e6);
printpow(7.0e10);
return 0;
}
给出作为输出:
7e-10 ^ 6 = 1.1764899999999995812e-55
7e-06 ^ 6 = 1.1764899999999999629e-31
0.007 ^ 6 = 1.1764900000000001195e-13
7 ^ 6 = 117649
7000 ^ 6 = 1.1764900000000000603e+23
7e+06 ^ 6 = 1.1764899999999999889e+41
7e+10 ^ 6 = 1.1764900000000000914e+65
解决方案
推荐阅读
- android - 如何为 android 启用 AllOpen 插件
- apache-spark - Spark - 将分区数减少到读取的文件夹数
- python - 为什么代码末尾的循环不起作用?
- twilio - 在使用 Whatsapp 时,您如何(或可以)使用 Twilio Studio 的拨打电话小部件?
- macos - 如何发布一个用flutter编写的macos应用
- svg - Jointjs v3.1.1 不支持 SVG-pan-zoom?
- python - 从 python 生成 bash 并打印消息
- c# - 将设备分配给对象以在 Unity 中执行输入操作
- r - r 循环优化(带有 sf 和 data.table 的 getMinBBox)
- ruby-on-rails - 使用带有 react-rails 预渲染的嵌套文件夹