为什么
这些数字是硬编码的,所以这个问题不是重复的。在那个问题中,因为两个浮点数相加产生了一个无理数,这意味着无法正确存储这些数字,但在我的情况下,数字是硬编码的,那么不能显式初始化为
考虑下面的程序:
我的编译器是Visual Studio 2019的内置编译器。
std::cout << 1.00000001;
打印出的是 1
?
当使用 1.0001
时,它可以正常工作,但只有在超过某个精度之后,它停止正确打印。这些数字是硬编码的,所以这个问题不是重复的。在那个问题中,因为两个浮点数相加产生了一个无理数,这意味着无法正确存储这些数字,但在我的情况下,数字是硬编码的,那么不能显式初始化为
1.00000001
的 float 无法打印(或存储)的原因是什么?
是因为 cout
无法打印该值还是真的是一个 int
?考虑下面的程序:
int main()
{
float num = 1.0000001f;
float num2 = num * 2;
std::cout << num;
std::cout << num2;
}
num2
打印2
,但编译器在line 2
没有警告将float
转换为int
,因此我认为num
必须是float
。这是否意味着这只是与cout
有关的问题?我可以安全地假设在内部,num
实际上是1.0000001f
,即使它在控制台上打印1
,也是这样吗?我的编译器是Visual Studio 2019的内置编译器。
1.0000001f
与1.0f
是相同的值(更准确地说:实现定义了符号1.0000001f
是否会给您浮点数1.0或1.00000011920928955078125。这两个都是编译器的有效选择,因为它们是最接近1.0000001的2个浮点数)。 - spectras