我正在运行一个简单的程序来测试C ++中浮点数和整数计算的限制。我知道#15和#19是不正确的返回值,但为什么#15特别错误?我不认为#19被0除以返回“inf”所以为什么要这样做呢?
#include "stdafx.h"
#include "stdlib.h"
#include <iostream>
#include <math.h>
float hyp(float x, float y) {
return sqrtf(x*x + y*y);
}
#include <stdio.h>
int main(void) {
float x = 3.0f, y = 4.0f, z = 5.0f;
for (int i = 0; i < 20; i++) {
float e = fabsf(hyp(x, y) - z) / z;
printf("%2d %e\n", i, e);
x *= 10.0f, y *= 10.0f, z *= 10.0f;
std::cout << z << std::endl;
}
}
输出如下:
0 0.000000e+00
50
1 0.000000e+00
500
2 0.000000e+00
5000
3 0.000000e+00
50000
4 0.000000e+00
500000
5 0.000000e+00
5e+06
6 0.000000e+00
5e+07
7 0.000000e+00
5e+08
8 0.000000e+00
5e+09
9 0.000000e+00
5e+10
10 0.000000e+00
5e+11
11 0.000000e+00
5e+12
12 0.000000e+00
5e+13
13 0.000000e+00
5e+14
14 0.000000e+00
5e+15
15 1.073742e-07
5e+16
16 0.000000e+00
5e+17
17 0.000000e+00
5e+18
18 0.000000e+00
5e+19
19 inf
5e+20
Press any key to continue . . .
答案 0 :(得分:4)
最大单精度浮点数约为$ composer install
...
Generating autoload files
(请参阅Wikipedia)。当您尝试平方1.7e+38
时,结果为5e+19
,这太大了,因此您获得了2.5e39
。
您为#15获得非零结果的原因是因为浮点数是近似值。见Is floating point math broken?