【发布时间】:2022-09-30 17:47:26
【问题描述】:
我目前正在 64 位 Fedora 36 上编程,我意识到 GMP 浮点数对指数大小有限制:https://gmplib.org/manual/Floating_002dpoint-Functions
每个浮点数的指数具有固定精度,在大多数系统上是一个机器字。在当前实现中,指数是肢体的数量,因此例如在 32 位系统上,这意味着大约 2^-68719476768 到 2^68719476736 的范围,或者在 64 位系统上,这将更大
例如,下面的 C 程序在我的机器上打印
0.1e-3215911262793760767。#include <assert.h> #include <stdio.h> #include <gmp.h> int main(void) { mpf_t f; const char *s = \"1e3000000000000000000000000000000\"; assert(mpf_init_set_str(f, s, 10) == 0); assert(mpf_out_str(NULL, 10, 100, f)); printf(\"\\n\"); }使用 C++ 接口时也会出现此问题。以下 C++ 程序输出
1e+-1294967296:#include <iostream> #include <gmpxx.h> int main(void) { mpf_class f(\"1e3000000000\"); std::cout << f << std::endl; }有没有办法检测指数溢出?例如,我期望
mpf_init_set_str()返回一个非零值来指示错误。或者,在初始化mpf_class f时可能会引发 C++ 异常。但是,目前浮点数已成功初始化为错误的值。否则,这是 GMP 中的错误吗?
-
我想知道这样的输入是从哪里来的,但是是的,只有 GMP 才能捕获它。
-
不是答案,但您应该将 MPFR 用于新代码,GMP 主要将 mpf_t 保留为旧代码。