返回值不正确:C++; 我正在运行一个简单的程序来测试浮点的限制和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; } }

返回值不正确:C++; 我正在运行一个简单的程序来测试浮点的限制和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; } },c++,floating-point,C++,Floating Point,最大单精度浮点数约为1.7e+38(请参阅)。当您尝试将5e+19平方时,结果是2.5e39,该值太大,因此您得到inf 得到#15的非零结果的原因是因为浮点是近似值。请参见您看到的结果取决于sqrtf的实现。除此之外很难说什么。x、y和z值应以全精度存储,因为浮点数中可存储的小数位数(小数位数的值)不存在舍入误差,为21(至少在我的机器上)。您的困惑部分来自于假设非零数字除以零是获取inf的唯一方法。inf是任何操作的结果,其结果不能用有限的数字表示,因为太大。@madmann91DECIMA

最大单精度浮点数约为
1.7e+38
(请参阅)。当您尝试将
5e+19
平方时,结果是
2.5e39
,该值太大,因此您得到
inf


得到#15的非零结果的原因是因为浮点是近似值。请参见

您看到的结果取决于
sqrtf
的实现。除此之外很难说什么。x、y和z值应以全精度存储,因为浮点数中可存储的小数位数(小数位数的值)不存在舍入误差,为
21
(至少在我的机器上)。您的困惑部分来自于假设非零数字除以零是获取inf的唯一方法。inf是任何操作的结果,其结果不能用有限的数字表示,因为太大。@madmann91
DECIMAL\u DIG
适用于
long double
类型。这里的所有浮点类型都是
float
。C++实现可以使用<代码>长双//>精度>代码>浮点< /COD>中间结果和常量,但是C和C++标准暗示别处的代码<浮标< /C>变量的内容必须是一个可表示为<代码>浮点的值。@ PascalCuoq谢谢您指出。在编译器使用IEEE 754 binary32作为浮点值的合理假设下,变量x、y和z应以此处使用的值的完全精度存储。
 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 . . .