gpt4 book ai didi

c++ - 在 C++ 中将大型无符号 float 四舍五入为整数的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 13:42:34 30 4
gpt4 key购买 nike

我需要使用标准的“math.h”中点舍入行为将 64 位 double 值舍入到我的代码中最接近的 uint64_t。其中一些数字具有以下属性:

  • 大于 LLONG_MAX
  • 小于或等于 ULLONG_MAX

  • 我注意到标准库舍入函数没有“未签名”版本。另外,我怀疑当中间 double 值太大而无法放入尾数时,人们用来执行此操作的一些技巧将不再起作用。
    进行这种转换的最佳方法是什么?

    最佳答案

    我会用 std::round然后钳制到 uint64 范围。您还需要决定如何处理 NaN。std::round不转换为整数。请注意,C 和 C++ 中的内置浮点到整数转换会截断和未定义超出范围的值。std::round实现标准的“学校”类型四舍五入到最接近的整数,中点情况向外四舍五入(例如 round(1.5) == 2; round(-1.5) = -2 )。
    当前舍入模式被忽略,这也不是 IEEE754 舍入到最接近。后者将使用 round half to even并将打破平局的情况上下舍入以减少统计偏差。
    对于 long long一个人会做这样的事情。

    double iv = std::round(val);
    if (std::isnan(iv)) {
    return 0LL;
    } else if (iv > LLONG_MAX)
    return LLONG_MAX;
    } else if (iv < LLONG_MIN) {
    return LLONG_MIN;
    } else {
    return (long long)iv;
    }
    unsigned long long case 是相应完成的。
    double iv = std::round(val);
    if (std::isnan(iv)) {
    return 0ULL;
    } else if (iv > ULLONG_MAX) // ok, if you know your values are less this can be spared of course
    return ULLONG_MAX;
    } else if (iv < 0) {
    return 0ULL;
    } else {
    return (unsigned long long)iv;
    }

    关于c++ - 在 C++ 中将大型无符号 float 四舍五入为整数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62880650/

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