如何使用 GMP 创建浮点数组?

Posted

技术标签:

【中文标题】如何使用 GMP 创建浮点数组?【英文标题】:How do I use GMP to create a floating-point array? 【发布时间】:2019-06-02 21:12:42 【问题描述】:

(警告:我是初学者,所以我所说或所做的某些内容可能不符合惯例)

我有一个函数式程序,开头的代码如下。

    long double p1[] =  1,0.708894879,0.264150943,0.105121294,0.525,0.437,0.916,0.237516005,1,0.516431925,1,0.799001248,0.436363636,0.45631068,0.4484375,0.366459627,0.369811321 ;
    long double p2[] =  1,0.529569892,0.346774194,0.107526882,0.587,0.353,0.885,0.475672215934624,1,0.446280992,1,0.678756477,0.585185185,0.489552239,0.408396947,0.266129032,0.463316583 ;
    long double p3[] =  1,0.52,0.163333333,0.07,0.516,0.402,0.816,0.667733676304516,1,0.518375242,1,0.761016949,0.462686567,0.445783133,0.416481069,0.368794326,0.557907845579078 ;
    long double p4[] =  1,0.53038674,0.367403315,0.121546961,0.551,0.274,0.736,0.899487836785253,1,0.268817204,1,0.681481481,0.36,0.382352941,0.27173913,0.209302326,0.0978260869565217 ;
    long double p5[] =  1,0.624203822,0.382165605,0.248407643,0.549,0.285,0.692,1.0,1,0.621212121,1,0.934131737,0.390243902,0.24,0.275641026,0.090909091,0.143968871595331 ;
    long double* p[] =  &p1[17], &p2[17], &p3[17], &p4[17], &p5[17], &p6[17] ;

不幸的是,一旦我将这些数组中的每一个扩展为大于 17 的大小,“long double”数据类型就不够大,并且我的程序出现了故障。

我了解到下一步是使用 GMP 库。我已经实现了 GMP 库,但我不知道如何使用它来替换“long double”。我特别无法设置数组值。

GMP 文档说:“一个 mpf_t 对象必须在存储第一个值之前进行初始化。”所以,我这样初始化我的对象:

    mpf_t p1[17];
    mpf_t p2[17];
    mpf_t p3[17];
    mpf_t p4[17];
    mpf_t p5[17];
    mpf_t p6[17];
    mpf_t p[17];

这段代码没有明显的错误。

但是,我看不到像在原始代码中那样显式设置数组值的方法。我查看了文档,但所有相关功能似乎只需要两个参数。

也许我必须这样做:

    mpf_set_d (p1[1], 1);
    mpf_set_d (p1[2], 0.708894879);
    ...

但我假设情况并非如此。虽然它可以工作,但它会非常乏味并且涉及大量复制粘贴,我被告知这是糟糕技术的标志。

有没有更好的方法?

提前致谢

【问题讨论】:

mpf_t p1[17]; 没有初始化任何东西。 @Swift-FridayPie 当GMP谈到初始化时,它的意思是gmplib.org/manual/Initializing-Floats.html#Initializing-Floats。 在包含<gmpxx.h>之后使用C++接口mpf_float 您使用的是 C 还是 C++? 【参考方案1】:

你听说过循环吗?他们很棒:-)

static const double p1_init[] =  1,0.708894879,0.264150943,0.105121294,0.525,0.437,0.916,0.237516005,1,0.516431925,1,0.799001248,0.436363636,0.45631068,0.4484375,0.366459627,0.369811321 ;

mpf_t p1[17];

for (int i = 0; i < 17; i++)

   mpf_init (p1[i]);
   mpf_set_d (p1[i], p1_init[i]);

现在您只需将其扩展为 p2p3 等。

上面代码的两个cmets:

    p1_init[] 声明为static const 只是为了让代码“更干净”。 作为初学者,如果您还没有,您可能可以在这里删除static const 已经了解了。

    c 数组从零开始。所有理智的编程语言都有从零开始的数组。 这意味着在一个有 17 个元素的数组中,第一个元素的索引为 0,并且 最后一个元素的索引为 16。没有索引为 17 的元素

【讨论】:

似乎建议创建 C++ 包装器或使用来自 boost 的 C++ 包装器。如果调用了mpf_init,则每个mpf_t 都需要mpf_clear。本质上,它是用 C 完成的非平凡对象的构造和销毁。

以上是关于如何使用 GMP 创建浮点数组?的主要内容,如果未能解决你的问题,请参考以下文章

用 GMP 解析十进制值?

如何在Java中将浮点数组转换为双精度数组?

如何将array_concat与浮点列和数组列一起使用

如何使用 xampp 在 OSX 上正确设置 php_gmp

如何在浮点数数组中创建一个由 1 组成的圆圈

使用 Mingw32 安装 gmp 时如何修复无休止的“检查是不是可以剥离库”