相关疑难解决方法(0)

如果operator <适用于浮点类型,为什么我们不能将它用于相等性测试?

正确地测试两个浮点数是否相等是包括我在内的很多人都不完全理解的.然而,今天,我想到了一些标准容器如何定义平等operator<.我总是看到人们在平等方面存在问题,但从未与其他关系比较相提并论.甚至可以使用它们的静默版本,其中包括除了平等和不平等之外的所有内容.

假设operator<作品"正常",不像operator==,为什么我们不能这样做:

bool floateq(float a, float b) {
    //check NaN
    return !(a < b) && !(b < a);
}
Run Code Online (Sandbox Code Playgroud)

其实,我并运行一个测试与双打额外的过载,因为看到这里,似乎有同样的缺陷作为他们的比较operator==:

std::cout << "float->double vs double: " 
          << floateq(static_cast<double>(0.7f), 0.7) << " " 
          << (static_cast<double>(0.7f) == 0.7) << "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

float-> double vs double:0 0

我是否担心使用所有比较运算符,或者是否存在比较我不理解的浮点数的其他方面?

c++ floating-point equality

17
推荐指数
1
解决办法
6905
查看次数

32位十进制数的浮点/双精度分析

从另一个人的.c文件中,我看到了这个:

const float c = 0.70710678118654752440084436210485f;
Run Code Online (Sandbox Code Playgroud)

他想避免计算的地方sqrt(1/2).

这可以用普通的方式存储C/C++吗?我的意思是没有失去精确度.对我来说似乎不可能.

我正在使用C++,但我不相信这两种语言之间的精确差异太大(如果有的话),那就是为什么我没有测试它.

所以,我写了几行,看看代码的行为:

std::cout << "Number:    0.70710678118654752440084436210485\n";

const float f = 0.70710678118654752440084436210485f;
std::cout << "float:     " << std::setprecision(32) << f << std::endl;

const double d = 0.70710678118654752440084436210485; // no f extension
std::cout << "double:    " << std::setprecision(32) << d << std::endl;

const double df = 0.70710678118654752440084436210485f;
std::cout << "doublef:   " << std::setprecision(32) << df << std::endl;

const long double ld = 0.70710678118654752440084436210485;
std::cout << "l double:  " << std::setprecision(32) …
Run Code Online (Sandbox Code Playgroud)

c c++ precision

3
推荐指数
1
解决办法
1976
查看次数

标签 统计

c++ ×2

c ×1

equality ×1

floating-point ×1

precision ×1