c++ - 浮点值等于整数

标签 c++ if-statement floating-point equality

<分区>

这个问题从根本上归结为 2 行,第 1 行将输出 1。

std::cout << sqrt(pow(b->x - a->x, 2) + pow(b->y - a->y, 2) + pow(b->z - a->z, 2)) << std::endl;

可是第二行会输出0,这怎么可能?

std::cout << (sqrt(pow(b->x - a->x, 2) + pow(b->y - a->y, 2) + pow(b->z - a->z, 2)) == 1) << std::endl;

最小的完整可验证示例:

struct vertice {
    double x, y, z;
    vertice(double x, double y, double z) {
        this->x = x;
        this->y = y;
        this->z = z;
    }
};

void cartDistance(const vertice * a, const vertice * b);

int main() {
    cartDistance(new vertice(0, 0, 0), new vertice(0, 0, 1));
    system("pause");
    return 0;
}

void cartDistance(const vertice * a, const vertice * b) {
    std::cout << "dist: " << sqrt(pow(b->x - a->x, 2) + pow(b->y - a->y, 2) + pow(b->z - a->z, 2)) << std::endl;
    std::cout << "dist check: " << (sqrt(pow(b->x - a->x, 2) + pow(b->y - a->y, 2) + pow(b->z - a->z, 2)) == 1) << std::endl;
}

最佳答案

流输出运算符是舍入的,因为您真的不想看到 0.999999999999999999997。数学是不精确的,这对你是隐藏的。不过,比较运算符确实关心这一点。

浮点运算需要小心。

使用std::setprecision()可以让你看到小数点后更多的数字,此时你的问题会更加明显。

关于c++ - 浮点值等于整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424778/

相关文章:

javascript - 添加 if 语句

在不损失精度的情况下将 unsigned 转换为 double 到 unsigned

c++ - msvc 和 gcc 不同的行为

javascript - 停止 setInterval 并执行其余代码

javascript - if 对一个值声明多个条件而不重复值

c - 为什么浮点比较在不同的编译器上给出不同的输出?

floating-point - 为什么从 0.0-1.0 区间转换时需要将 RGB 值乘以 256 而不是 255?

c++ - Qt QUrl : doesn't url-encode colon

c++ - 声明后初始化对象时“不匹配调用”

c++ - 如何从核心转储文件中识别导致崩溃的完整命令