如何使用 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]);
现在您只需将其扩展为 p2
、p3
等。
上面代码的两个cmets:
将p1_init[]
声明为static const
只是为了让代码“更干净”。
作为初学者,如果您还没有,您可能可以在这里删除static const
已经了解了。
c
数组从零开始。所有理智的编程语言都有从零开始的数组。
这意味着在一个有 17 个元素的数组中,第一个元素的索引为 0,并且
最后一个元素的索引为 16。没有索引为 17 的元素
【讨论】:
似乎建议创建 C++ 包装器或使用来自 boost 的 C++ 包装器。如果调用了mpf_init
,则每个mpf_t
都需要mpf_clear
。本质上,它是用 C 完成的非平凡对象的构造和销毁。以上是关于如何使用 GMP 创建浮点数组?的主要内容,如果未能解决你的问题,请参考以下文章