gpt4 book ai didi

c++ - 如何正确比较整数和浮点值?

转载 作者:行者123 更新时间:2023-12-03 17:59:18 27 4
gpt4 key购买 nike

如何以正确的方式比较整数和浮点值?

内置比较运算符在某些边缘情况下会给出不正确的结果,例如:

#include <iomanip>
#include <iostream>

int main()
{
long long a = 999999984306749439;
float b = 999999984306749440.f; // This number can be represented exactly by a `float`.

std::cout << std::setprecision(1000);
std::cout << a << " < " << b << " = " << (a < b) << '\n';
// Prints `999999984306749439 < 999999984306749440 = 0`, but it should be `1`.
}

显然,比较运算符在实际比较它们之前将两个操作数转换为相同的类型。这里 lhs 被转换为 float ,这会导致精度损失,并导致不正确的结果。

尽管我明白发生了什么,但我不确定如何解决这个问题。

免责声明:该示例使用 float和一个 long long ,但我正在寻找适用于整数类型和浮点类型的每种组合的通用解决方案。

最佳答案

(将此答案限制为正数;泛化是微不足道的。)

  • 获取 float 的指数中的位数在您的平台上与基数一起。如果您有 IEEE754 32 位 float那么这是一个微不足道的步骤。
  • 使用 (1) 计算可以存储在您的 float 中的最大非整数值. std::numeric_limits没有指定这个值,很烦人,所以你需要自己做。对于 32 位 IEEE754,您可以采用简单的选项:8388607.5是最大的非积分型float .
  • 如果您的 float小于或等于(2),然后检查它是否为整数。如果它不是整数,那么您可以适本地舍入它以免使 < 无效。 .
  • 此时,float是一个整数。检查它是否在您的 long long 范围内.如果超出范围,则结果 <是已知的。
  • 如果你走到这一步,那么你可以安全地投你的 floatlong long ,并进行比较。
  • 关于c++ - 如何正确比较整数和浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58734034/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com