我正在尝试编写一个程序来查找mersenne素数.使用无符号长long类型,我能够确定第9个mersenne prime的值,即(2 ^ 61)-1.对于较大的值,我需要一种可以存储大于2 ^ 64的整数值的数据类型.请帮忙.(我应该能够使用这种数据类型的运算符,如, =,>,<和%.)
考虑您要计算64位和128位无符号数乘以结果的低128位,并且您可用的最大乘法是C类64位乘法,它需要两个64位无符号输入并返回结果的低64位.
需要多少次乘法?
当然你可以用8来做:将所有输入分解为32位块并使用64位乘法来进行4*2 = 8所需的全宽32*32-> 64乘法,但是可以做得更好?
当然,算法应该在乘法之上仅进行"合理"数量的加法或其他基本算术(我对重新发明乘法作为加法循环并因此声称"零"乘法的解决方案不感兴趣).
我正在运行物理实验的模拟,所以我需要非常高的浮点精度(超过16位).我使用Boost.Multiprecision,但无论我怎么做,我都无法获得高于16位的精度.我使用C++和eclipse编译器运行模拟,例如:
#include <boost/math/constants/constants.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
#include <limits>
using boost::multiprecision::cpp_dec_float_50;
void main()
{
cpp_dec_float_50 my_num= cpp_dec_float_50(0.123456789123456789123456789);
std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10);
std::cout << my_num << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0.12345678912345678379658409085095627233386039733887
^
Run Code Online (Sandbox Code Playgroud)
但它应该是:
0.123456789123456789123456789
Run Code Online (Sandbox Code Playgroud)
如您所见,在16位数之后它是不正确的.为什么?
我正在尝试使用巨大的小数C++添加减法和乘法数字.
例:
4125487821547.87879845215584844588 - 354556689.899455132265468
到目前为止我想到的是我需要将输入保存为字符串,但不确定如何继续.
提前感谢您的帮助谢谢
我想在一个long int变量中存储两个32位值.
你会如何在使用C的32位操作系统上执行此操作?是否可以将数据存储在一个长long变量中?如果是这样,那怎么办?
正如Boost Multiprecision库文档中所明确的那样,将a从a转换为a是很简单boost::multiprecision::cpp_int的boost::multiprecision::cpp_dec_float:
// Some interconversions between number types are completely generic,
// and are always available, albeit the conversions are always explicit:
cpp_int cppi(2);
cpp_dec_float_50 df(cppi); // OK, int to float // <-- But fails with cpp_dec_float<0>!
Run Code Online (Sandbox Code Playgroud)
从a转换cpp_int为固定宽度浮点类型(即a cpp_dec_float_50)的能力给出了一种希望,即可以在库中从a转换cpp_int为任意宽度的浮点类型 - 即a cpp_dec_float<0>.但是,这不起作用; 我在Visual Studio 2013中转换失败,如下面的简单示例程序演示:
#include <boost/multiprecision/number.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
int main()
{
boost::multiprecision::cpp_int n{ 0 };
boost::multiprecision::cpp_dec_float<0> f{ n }; // Compile error in …Run Code Online (Sandbox Code Playgroud) 我正在使用boost multiprecision库,更确切地说是boost :: multiprecision :: float128类型.使用ICPC进行编译,在尝试执行以下操作时遇到一些错误:
double a = functionA();
Run Code Online (Sandbox Code Playgroud)
其中functionA()返回一个boost :: multiprecision :: float128变量.
error: no suitable conversion function from "boost::multiprecision::float128" to "double" exists|
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
如何DECIMAL在MySQL中正确划分两个值并获得精确到列类型中定义的位数的结果?
例:
select cast(1/2 as decimal(4,4)),
cast(1 as decimal(4,4))/2,
cast(1 as decimal(4,4))/cast(2 as decimal(4,4));
Run Code Online (Sandbox Code Playgroud)
结果:
'0.5000', '0.49995000', '1.00000000'
Run Code Online (Sandbox Code Playgroud)
为什么第二个结果是否真空?为什么第三个结果不是"0.5000"?
注意:我不能只使用第一个表单,我需要使用存储为小数的列执行计算.
您知道如何使用 Boost::multiprecison 执行这行简单的代码而不会出错吗?
boost::multiprecision::cpp_int v, uMax, candidate;
//...
v += 6 * ceil((sqrt(uMax * uMax - candidate) - v) / 6);
Run Code Online (Sandbox Code Playgroud)
使用 MSVC 时,"sqrt" 会出现错误,可以通过以下方式修复它:
v += 6 * ceil((sqrt(static_cast<boost::multiprecision::cpp_int>(uMax * uMax - candidate)) - v) / 6);
Run Code Online (Sandbox Code Playgroud)
然后“ceil”出现错误,可以通过以下方式修复它:
namespace bmp = boost::multiprecision;
typedef bmp::number<bmp::cpp_dec_float<0>> float_bmp;
v += 6 * ceil(static_cast<float_bmp>((sqrt(static_cast<bmp::cpp_int>(uMax * uMax - candidate)) - v) / 6));
Run Code Online (Sandbox Code Playgroud)
那么就出现了“通用互变”的错误!?!
我认为应该有一种更优雅的方式来实现如此简单的代码行,不是吗?如果您对此有一些想法,请告诉我。
问候。