gpt4 book ai didi

c++ - 用 C++ 编写符合 IEEE-754 标准的双/浮点除法的最快方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 20:21:18 25 4
gpt4 key购买 nike

我想用 C++ 编写符合 IEEE-754 的除法,尤其是关于被零处理的除法:positive/0->Inf, negative/0->-Inf, 其他一切/0->NaN

虽然一个简单的 C++ 除法在我的机器上 会导致这种行为,但 C++ 标准并不强制要求这种语义。它是未定义的,所以我不能依赖它。

那么在 C++ 中实现它的最快方法是什么?当然,我可以像这样进行显式测试:

double fdiv64(double numerator, double denominator)
{
using limits=std::numeric_limits<double>;
if (denominator==0.0) {
if (numerator>0.0) {
return limits::infinity();
} else if (numerator<0.0) {
return -limits::infinity();
} else {
return limits::quiet_NaN();
}
} else {
return numerator/denominator;
}
}

但是这引入了额外的分支并且在我的机器上完全是多余的,因为无论如何我都得到了正确的行为。似乎没有执行 IEEE-754 兼容除法的编译器内在函数。我可以使用内联汇编,但这也非常不可移植。

那么做这个除法最快的方法是什么?

最佳答案

除非您在软件中为本身不使用它的平台构建您自己的 IEEE754 浮点实现,否则恐怕无法移植不是内置类型(例如 &&|| 如果你重载它们就不会短路);尽管用户定义的文字可能会有帮助。

例如支持infinity是可选的,并且仅在 std::numeric_limits<T>::has_infinity == true 时出现在平台上适合您的类型 T .

因此,尝试优化您声称的可移植代码甚至不在讨论范围内。

引用资料:

http://en.cppreference.com/w/cpp/types/numeric_limits/infinity http://en.cppreference.com/w/cpp/language/user_literal

关于c++ - 用 C++ 编写符合 IEEE-754 标准的双/浮点除法的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44717764/

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