【问题标题】:Are 3.5 and 3.5f the same in C++? [duplicate]C++ 中的 3.5 和 3.5f 是否相同? [复制]
【发布时间】:2012-05-08 20:15:34
【问题描述】:

可能重复:
strange output in comparision of float with float literal
Why comparing double and float leads to unexpected result?

在下面的代码中,我期望答案是“不相等”,因为默认情况下,3.5 在 C++ 中应该是 double,但结果是“相等”。

声明float a=3.5ffloat a=3.5有什么区别?

#include<iostream>
using namespace std;

int main()
{
    float a=3.5;
    if(a==3.5)  
        cout<<"equal"<<endl;
    else
        cout<<"Not equal"<<endl;
    return 0;
}

【问题讨论】:

  • 尝试创建一个双精度和浮点数,它们都等于 1.0/3.0,然后看看它们是否相等。你会发现他们不是。
  • 是的 Benj 我明白你的意思。你的意思是说这些是不相等的,因为精度。
  • 在比较浮点值是否相等时,我总是使用:fabs(v1-v2)

标签: c++ floating-point number-formatting


【解决方案1】:

没有。

3.5 的类型是 double3.5f 的类型是浮点数。因此,它们不保证在值上相等

#include<iostream>

void f(double) { std::cout << "it is double" << std::endl; }
void f(float)  { std::cout << "it is float" << std::endl; }

int main()
{
   f(3.5);
   f(3.5f);
}

Output:

it is double
it is float

【讨论】:

  • 3.5 == 3.5f 由 IEEE754 保证,目前大多数“正常”系统都在使用。
  • 但不保证10.0f/3.0f等于10.0/3.0。他碰巧选了一个准确的数字。
  • @FredOverflow: 是的,"3.5 == 3.5f 由 IEEE754 保证",但 C++ 不保证,因为实现可以选择 any 浮点格式。
【解决方案2】:

浮点数不是一个确切的数字。将它们与 == 进行比较绝不是一个好主意。 原因如下:What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

  • 浮点数do 表示精确数字;但是,有很多数字不能用任何浮点数表示。
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 2016-10-26
  • 2011-03-26
  • 2010-12-19
  • 2012-08-04
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多