找回密码
 欢迎注册
查看: 8372|回复: 9

[求助] 关于128比特的指数、对数运算的实现

[复制链接]
发表于 2019-1-18 15:05:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
C++里面的double和long double只有$64$和$80$比特的精度,

但是我对精度的需求比较高,至少需要$128$比特的精度,

其中$1$比特用来表示正负号,$15$比特用来表示量级,其余$112$比特用来记录数据。

想问一下各位坛友,这样的浮点数的自然对数、自然指数是否已经实现?

如果是的话,能否拿到源代码?

如果还没实现,我将亲自出马,解决我自己的需求。

有了这两个函数,$x^y$运算就可以实现了:

$x^y=e^{y*ln(x)}$

参考文献$1$:

https://blog.csdn.net/qq_34030789/article/details/51476292
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-1-18 19:13:55 来自手机 | 显示全部楼层
用gmp的mpf_t如何?

点评

根据您给出的线索,我找到了第二篇参考文献: 【https://bbs.csdn.net/topics/390492487】 您能解试一下算不准的问题吗?  发表于 2019-1-19 03:00
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2019-1-19 03:02:28 | 显示全部楼层
参考文献$2$:

————————————————————
急问:gmp高精度库浮点数使用问题 [问题点数:40分]

请问,gmp中的gmf_t高精度浮点数计算有问题?

比如:3.14/5.789

gmp结果:0.5424080152012437381240283295906

windows自带计算器和Java中的大数处理函数计算出来是:0.5424080152012437381240283295906

gmp从小数点后17位就不准了

这是怎么回事,gmp不是号称最好的高精度库吗?怎么一个浮点数除都不准啊!

#####

是我贴错了

请问,gmp中的gmf_t高精度浮点数计算有问题

比如:3.14/5.789

gmp结果:0.5424080152012437875651563769429

windows自带计算器和Java中的大数处理函数计算出来是:0.5424080152012437381240283295906

gmp从小数点后17位就不准了

这是怎么回事,gmp不是号称最好的高精度库吗?怎么一个浮点数除都不准啊!

是否是使用mpf_set_d去对gmf_t赋值的?这个会影响两个输入数据的精度。

看以下代码:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "gmp.h"
  4. #define USE_STR 1
  5. int main()
  6. {
  7.   mpf_t a, b, res;

  8.   mpf_init2(a, 256);
  9.   mpf_init2(b, 256);
  10.   mpf_init2(res, 256);
  11. #if USE_STR
  12.   mpf_set_str(a, "3.14", 10);
  13.   mpf_set_str(b, "5.789", 10);
  14. #else
  15.   mpf_set_d(a, 3.14);
  16.   mpf_set_d(b, 5.789);
  17. #endif
  18.   mpf_div(res, a, b);

  19.   gmp_printf ("%.*Ff/%.*Ff", 50, a, 50, b);
  20.   gmp_printf ("=%.*Ff\n", 50, res);

  21.   mpf_clear(a);
  22.   mpf_clear(b);
  23.   mpf_clear(res);

  24.   return 0;
  25. }
复制代码

当USE_STR=1时,输出结果如下:

3.14000000000000000000000000000000000000000000000000
/
5.78900000000000000000000000000000000000000000000000
=
0.54240801520124373812402832959060286750734150975989

当USE_STR=0时,输出结果如下:

3.14000000000000012434497875801753252744674682617188
/
5.78899999999999970157205098075792193412780761718750
=
0.54240801520124378756515637694292549171967387220245
————————————————————

点评

pari/gp:default(realprecision,10000)可以设置10000位十进制有效数字  发表于 2019-1-19 07:55
如果3.14跟5.789都是gmp库自己算出来的数字,不会有这样的误差  发表于 2019-1-19 07:46
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-1-19 07:45:34 | 显示全部楼层
KeyTo9_Fans 发表于 2019-1-19 03:02
参考文献$2$:

————————————————————

看来是舍入误差的问题了
mpf_set_d(a, 3.14)
这句话损失了精度
因为浮点数3.14代表的是一个分数
5.789同理
用python的Fraction库可以把这个分数读出来:
>>> Fraction(3.14)
Fraction(7070651414971679, 2251799813685248)
>>> Fraction(5.789)
Fraction(3258917280355975, 562949953421312)
于是你用double计算的3.14/5.789其实是用的
Fraction(7070651414971679, 2251799813685248)/Fraction(3258917280355975, 562949953421312)
约分结果是
Fraction(7070651414971679, 13035669121423900)
用pari/GP计算这个分数,得到:
0.54240801520124378756515637694292549172
前几位跟你写的一致
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2019-1-19 08:12:15 来自手机 | 显示全部楼层
这个是因为double精度只有14位左右。mpf_set_d的输入参数类型是double,而计算机表达数值采用二进制,对于无法用二进制标识为有限小数的数值,在计算机里面用double表示是有误差的,而这个转化这里是c编译器做的,gmp毫无办法改善。如果我们换成二进制表示有限的小数比如0.375,那么就不会有精度问题了

点评

我找到了第$3$篇参考文献: https://www.cnblogs.com/math-mao/archive/2013/05/15/3080181.html 先按照这个试试~  发表于 2019-1-19 11:54
[Error] gmp.h: No such file or directory 如何获得gmp.h这个文件?  发表于 2019-1-19 11:53
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-28 03:41 , Processed in 0.028022 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表