我编写了一个程序,它执行一些非常大的简单算术运算。我成功地使用了 boost 多精度库中的 mpz_int 和 mpf_float,但发现我需要更高的精度来实现我的目的。我一直在尝试使用 mpfr 库来定义更精确的浮点数。我能够编译我的代码,但现在收到运行时错误 libc++abi.dylib: terminating with uncaught exception of type boost::exception_detail::clone_impl >: The string “1572…[4000 digits]…00.328” can不被解释为一个有效的整数。
我有一种感觉,这是我尝试将我创建的 mpfr_float 转换为导致问题的整数。我从一个整数字符串初始化浮点数,并在尝试向下舍入并转换为整数之前进行一些除法。这是我的类型定义:
typedef boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<4680> > bloatfloat;
我的声明:
bloatfloat seed(“4716…etc.”);
和我尝试的转换:
boost::multiprecision::mpz_int seedint = seed.convert_to<boost::multiprecision::mpz_int>();
如果有人可以帮助我完成此转换并避免运行时错误,我将不胜感激。我认为尽管我的困惑的根源可能比这更深,所以我想解释一下我的项目,看看是否有人能告诉我,我正在做的事情是否从根本上是错误的。
我正在尝试创建看起来随机但由可预测的伪随机函数构成的文本页面。因此,如果有人输入 1,然后是 2,然后是 3,他们会注意到三页文本之间没有任何模式,但是输入任何这些数字每次都会给出相同的文本。我正在尝试创建 29 个字符的页面的所有可能性 3200 次,或 29^3200 个可能性(大约 10^4680)。
我正在使用暂停序列来生成伪随机质量,并将结果乘以 29^3200。
这是我的暂停序列:
while (input>0) {
denominator *=3;
numerator = numerator * 3 + (input%3);
input = input/3;
}
然后,我从结果数字到 base-29 进行基本转换,以获得一页文本。最初我将 mpz_int 用于 29^3200(从字符串初始化) - 但我发现这会产生重复模式。取决于halton序列的分母是什么。例如,产生分母 243 的输入将产生一页文本,其中相同的 162 个字符从 3200 个字符重复,只是在不同的位置。
这是我的程序的基本转换部分:
boost::multiprecision::mpz_int seedint(seed); //converts from mpf_float
boost::multiprecision::mpz_int holder = 0;
std::string permuda [29] = {" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ",", "."};
std::string book = "";
holder = seedint%29;
int conversion = holder.convert_to<int>();
book = permuda[conversion];
while (seedint>=29) {
seedint = seedint/29;
holder = seedint%29;
conversion = holder.convert_to<int>();
book.insert(0,permuda[conversion]);
}
std::cout << book << "\n";
我对数学的理解不够好,无法理解为什么会发生这种重复,但凭直觉我改成了浮点数。我发现这样做要好得多 - 模式要短得多,并且只会开始出现在输出字符串的开头(代表更高的值),但最终它们仍然存在并且可以识别。我发现 mpf_float 比 mpf_float_1000 工作得更好,而且在产生更多看似随机的结果方面,它们都比 mpz_int 好得多。
正如我之前提到的,我的表面问题很简单:我如何避免这个运行时错误?但我更关心的是:a)为什么会出现这些模式?我是否正确,精度更高的浮点数会消除这些重复的字符串?b) 如果是这样,mpfr_float 是最好的数据类型吗?我应该给它什么程度的精确度?c) 如果不是,我应该使用什么数据类型?
我非常感谢任何可以回答这些问题的人。
- -编辑 - -
我解决了我遇到的问题,方法是坚持使用 mpf_float,使用 29^3280 作为种子,并切断最后 80 个重复的字符。不过,我仍然对固定精度和可变精度感到好奇。当我试图用更高的模板参数定义一个固定精度的 gmp_float 时,我得到了更糟糕的结果。究竟什么是固定精度和可变精度,为什么会产生这样的结果?