为啥 Boost::multiprecision::sqrt(1) 返回 0?

Posted

技术标签:

【中文标题】为啥 Boost::multiprecision::sqrt(1) 返回 0?【英文标题】:Why does Boost::multiprecision::sqrt(1) return 0?为什么 Boost::multiprecision::sqrt(1) 返回 0? 【发布时间】:2016-10-30 20:23:16 【问题描述】:

Boost::multiprecision::sqrt(1) 似乎返回 0

#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/number.hpp>
#include <iostream>

using std::cout;
using std::endl;

int main() 
   namespace mp = boost::multiprecision;
   mp::cpp_int i(1); 
   cout << "i == " << i << endl;
   cout << "mp::sqrt(i) == " << mp::sqrt(i) << endl;

输出: 我 == 1 mp::sqrt(i) == 0

我希望 sqrt(1) == 1。

我在coliru 和本地安装的 gcc 和 Boost 1.62 上得到了相同的结果。这会发生在其他人身上吗?我错过了什么还是这是一个错误?

【问题讨论】:

Eeerm,你还能期待什么? 我希望 sqrt(1) == 1 这看起来 100% 像一个错误,并且对边缘情况的测试非常糟糕。 coliru.stacked-crooked.com/a/068a750da56b55d1 【参考方案1】:

是的,这绝对是一个错误。 3 天前,它以ticket #12559 的身份向 Boost 错误跟踪器报告。

【讨论】:

谢谢!不知道我是如何在错误跟踪器中错过这个的。

以上是关于为啥 Boost::multiprecision::sqrt(1) 返回 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在这里使用 boost::multiprecision::cpp_int 会影响尾调用优化

为啥这个记忆代码段错误?

boost::multiprecision 中随机,种子无法编译

具有固定精度的重载 boost::multiprecision::pow

带有 boost::multiprecision 的单元测试

具有两个 cpp_int 值的 boost::multiprecision::pow