返回值不正确:C ++

时间:2016-09-05 22:56:00

标签: c++ floating-point

我正在运行一个简单的程序来测试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 . . .

1 个答案:

答案 0 :(得分:4)

最大单精度浮点数约为$ composer install ... Generating autoload files (请参阅Wikipedia)。当您尝试平方1.7e+38时,结果为5e+19,这太大了,因此您获得了2.5e39

您为#15获得非零结果的原因是因为浮点数是近似值。见Is floating point math broken?