【发布时间】:2015-04-08 09:06:31
【问题描述】:
根据The C++ Programming Language - 4th,第 6.2.5 节:
共有三种浮点类型:float(单精度)、double(双精度)和 long double(扩展精度)
参考:http://en.wikipedia.org/wiki/Single-precision_floating-point_format
真正的有效位包括二进制点右侧的 23 个小数位和一个值为 1 的隐式前导位(二进制点左侧),除非指数以全零存储。 因此只有 23 个小数位出现在内存格式中,但总精度为 24 位(相当于 log10(224) ≈ 7.225 个十进制数字)。
→ 浮点数的最大位数是binary32 interchange format 上的7 位数。 (在计算机内存中占用 4 个字节(32 位)的计算机数字格式)
当我在不同的编译器(如 GCC、VC 编译器)上进行测试时
→ 它总是输出6 作为值。
查看每个编译器的float.h
→ 我发现6 是固定的。
问题:
- 你知道为什么这里会有不同(实际值理论值 - 7 - 和实际值 - 6 之间)吗?
听起来 "7" 更合理,因为当我使用下面的代码进行测试时,该值仍然有效,而 "8" 无效 - 为什么编译器不检查交换格式以决定浮点数表示的位数(而不是使用固定值)?
代码:
#include <iostream>
#include <limits>
using namespace std;
int main( )
{
cout << numeric_limits<float> :: digits10 << endl;
float f = -9999999;
cout.precision ( 10 );
cout << f << endl;
}
【问题讨论】:
-
“它总是输出 6 作为值。” 这可以从您的问题的其余部分推断出来,但以后请告诉我们“它”是什么。跨度>