我在一个大型 C 编程项目中遇到了一个数值问题。(这是统计研究,不是课堂作业)。第一步涉及计算 sqrt(x^2 + y) - x,我需要为正数,但有时即使 x > 0 且 y > 0,我也会得到 sqrt(x^2 + y) - x < 0。示例:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
float x = 1210.9088134,
y = 0.0062529947;
printf("x =\t\t\t%70.50f\n", x);
printf("y =\t\t\t%70.50f\n", y);
printf("x*x =\t\t\t%70.50f\n", x*x);
printf("x*x + y =\t\t%70.50f\n", x*x + y);
printf("sqrt(x*x + y) =\t\t%70.50f\n", sqrt(x*x + y));
printf("sqrt(x*x + y) - x =\t%70.50f\n", sqrt(x*x + y) - x);
}
我的输出:
x = 1210.90881347656250000000000000000000000000000000000000
y = 0.00625299476087093353271484375000000000000000000000
x*x = 1466300.12500000000000000000000000000000000000000000000000
x*x + y = 1466300.12500000000000000000000000000000000000000000000000
sqrt(x*x + y) = 1210.90880127282912326336372643709182739257812500000000
sqrt(x*x + y) - x = -0.00001220373337673663627356290817260742187500000000
这个输出充满了奇怪的行为。强调:
- 我分配了 y 0.0062529947,但它输出为 0.00625299476087093353271484375。
- x*x + y 打印出与 x*x 相同的值。
- sqrt(x*x + y) - x < 0。
为什么会发生1-3?
我应该提一下:我在具有 gcc 版本的 64 位 Mac OX 10.9.4 机器上运行了这个示例:
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
和具有 gcc 版本的 64 位 CentOS 服务器:
$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
此外,编译在任何一台机器上都没有返回错误或警告:
$ gcc -lm -Wall -pedantic -ansi test.c -o test