#include

#include

#include

#include

int main(){

// void mpf_set_default_prec(mp_bitcnt_t prec)

// 将默认精度设置为至少 prec 位。所有后续调用mpf_init将使用此精度,但先前初始化的变量不受影响。

// 这个值可以按需设置,比如计算毫秒级时间,

mpf_set_default_prec(64); // 默认精度,即小数点后精确多少位

/*

* 浮点数的结构体

typedef struct

{

int _mp_prec;// mp_limb_t 的最大精度。由 mpf_init 设置,

// 由 mpf_set_prec 修改。

// _mp_d字段指向的区域包含' prec' + 1个 limb(s)。

int _mp_size;// abs(_mp_size)是最后一个字段指向的 limb(s) 数。

// 如果 _mp_size 是负数,则这就是一个负数。

mp_exp_t _mp_exp; // 以 mp_limb_t 为底的指数。

mp_limb_t *_mp_d; // 指向 limb(s) 的指针。

} __mpf_struct;

* */

mpf_t a, b, c, d, e, f, g, h;

// 第一种初始化 + 赋值的方法

mpf_init(a); // 初始化变量 a

mpf_set_ui(a, 0); // 为 a 赋值,a=0

// 第二种初始化并同时赋值的方法

mpf_init_set_ui(b, 3); // 初始化 b,并把 3 赋值给它,即 b=3

mpf_init_set_ui(c, 5); // 初始化的值为无符号整数

mpf_init_set_ui(d, 7);

mpf_init_set_ui(e, 300);

int res = mpf_init_set_str(f, "8", 10); // 正确,则返回0; 错误,则返回-1

std::cout << "-- mpf_init_set_str() [0:正确,-1:错误] res= " << res << std::endl;

mpf_init_set_str(g, "19", 10); // 初始化的值为字符串

mpf_init_set_si(h, -10); // 初始化值为有符号的数

// mpf_init()的功能 + mpf_set()的功能 = mpf_init_set()的功能

// mpf_init()的功能 + mpf_set_ui()的功能 = mpf_init_set_ui()的功能

gmp_printf("-- a= %Ff, b= %Ff, c= %Ff, d= %Ff, e= %Ff, f= %Ff, g= %Ff\n", a, b, c, d, e, f, g); // 显示初始化的变量值

mpf_add(a, b, c); // 加法

gmp_printf("-- 加法(a=b+c):\t\t%Ff\n", a); // 默认保留 6 位小数

gmp_printf("-- 加法(a=b+c)[精度 2]:%.*Ff\n", 2, a);

mpf_add(a, b, f); // 加法

gmp_printf("-- 加法(a=b+f)[精度 2]:%.*Ff\n", 2, a);

mpf_add(a, c, f); // 加法

gmp_printf("-- 加法(a=c+f)[精度 2]:%.*Ff\n", 2, a);

mpf_add(a, g, f); // 加法

// 打印结构体元素

gmp_printf("-- 加法(a=g+f)[精度 2]:\t%.*Ff,\t_mp_prec= %d, _mp_size= %d, _mp_exp= %d, _mp_d= %d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_sub(a, b, c); // 减法

gmp_printf("-- 减法(a=b-c):\t\t%Ff\n", a); // 默认保留 6 位小数

// 打印结构体元素

gmp_printf("-- 减法(a=b-c)[精度 2]:\t%.*Ff,\t_mp_prec= %d, _mp_size= %d, _mp_exp= %d, _mp_d= %d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_mul(a, b, c); // 乘法

gmp_printf("-- 乘法(a=b*c):\t\t%Ff\n", a); // 默认保留 6 位小数

// 打印结构体元素

gmp_printf("-- 乘法(a=b*c)[精度 2]:\t%.*Ff,\t_mp_prec= %d, _mp_size= %d, _mp_exp= %d, _mp_d= %d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_div(a, b, d); // 除法

gmp_printf("-- 除法(a=b/d):\t\t%Ff\n", a); // 默认保留 6 位小数

gmp_printf("-- 除法(a=b/d)[精度 2]:\t%.*Ff\n", 2, a);

gmp_printf("-- 除法(a=b/d)[精度 9]:\t%.*Ff\n", 9, a);

// 打印结构体元素

gmp_printf("-- 除法(a=b/d)[精度 10]:%.*Ff,\t_mp_prec=%d, _mp_size=%d, _mp_exp=%d, _mp_d=%d\n", 10, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

/**

* gmp 数据转换为字符串

* char * mpf_get_str (char *str, mp_exp_t *expptr, int base, size_t n_digits, const mpf_t op)

* str: 如果为nullptr,则函数返回转换后的值;如果为非nullptr,则此变量保存转换后的值

* expptr: 小数点的下标位置,因为转换后的数字字符串是纯数字的。

* 即:如op=3.1415926,则expptr=1;如op=314.15926,则expptr=3;如op=0.314,则expptr=0

* base: 进制,范围:2..36,使用数字和小写字母;-2 ..- 36,使用数字和大写字母;

* 37..62,使用数字,大写字母和小写字母(按重要性顺序)

* n_digits:最多生成n_digits个数字。如果 n_digits为0,则将生成该准确的最大位数。

* 当n_digits为0以获取所有有效数字时,应用程序将无法知道所需的空间,

* 在这种情况下,str应该是nullptr

* op: 被转换的数据

*/

char *word; // 保存转换完的数据

int length; // 转换完的字符串长度

mp_exp_t exponent; // 保存结果字符串

word = mpf_get_str(nullptr, &exponent, 10, 0, a);

length = strlen(word);

printf("-- mpf_get_str(): word:\texponent= %ld, length= %d, word= %s\n", exponent, length, word);

mpf_div(a, e, d); // 除法

gmp_printf("-- 除法(a=e/d)[精度 10]:%.*Ff\n", 10, a);

word = mpf_get_str(nullptr, &exponent, 10, 0, a); // 把gmp数字转为字符串

length = strlen(word);

printf("-- mpf_get_str(): word:\texponent= %ld, length= %d, word= %s\n", exponent, length, word);

mpf_pow_ui(a, b, 3); // 幂

gmp_printf("-- 幂(a=b^3)[精度 2]:%.*Ff,\t_mp_prec=%d, _mp_size=%d, _mp_exp=%d, _mp_d=%d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_mul_2exp(a, b, 0); // a = b * 2^0

gmp_printf("-- 2exp(a=b* 2^0)[精度 2]:%.*Ff,\t_mp_prec=%d, _mp_size=%d, _mp_exp=%d, _mp_d=%d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_mul_2exp(a, b, 1);

gmp_printf("-- 2exp(a=b* 2^1)[精度 2]:%.*Ff,\t_mp_prec=%d, _mp_size=%d, _mp_exp=%d, _mp_d=%d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_mul_2exp(a, b, 2);

gmp_printf("-- 2exp(a=b* 2^2)[精度 2]:%.*Ff,\t_mp_prec=%d, _mp_size=%d, _mp_exp=%d, _mp_d=%d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

mpf_mul_2exp(a, b, 3);

gmp_printf("-- 2exp(a=b* 2^3)[精度 2]:%.*Ff,\t_mp_prec=%d, _mp_size=%d, _mp_exp=%d, _mp_d=%d\n", 2, a, a->_mp_prec, a->_mp_size, a->_mp_exp, *a->_mp_d);

// 把 b 的值赋给 a

mpf_set(a, b);

gmp_printf("-- 把 b 的值赋给 a, a:%.*Ff\n", 2, a);

// 取反,把 b 取反后的值赋给 a

mpf_neg(a, b);

gmp_printf("-- 取反,把 b 取反后的值赋给 a, a:%.*Ff\n", 2, a);

// 绝对值

mpf_abs(a, a);

gmp_printf("-- 绝对值,a:%.*Ff\n", 2, a);

// 转换 gmp 数据

unsigned int ui = mpf_get_ui(b); // gmp 数据转为 ui 类型数据

printf("-- mpf_get_ui(): b: unsigned int ui= %d\n", ui);

ui = mpf_get_ui(c); // gmp 数据转为 ui 类型数据

printf("-- mpf_get_ui(): c: unsigned int ui= %d\n", ui);

// double mpf_get_d_2exp(signed long int *exp, const mpf_t op)

// https://gmplib.org/manual/Converting-Floats

signed long int exp; // 保存精度

double d_2exp = mpf_get_d_2exp(&exp, a); // a = d_2exp * 2^exp, a = d_2exp * 2^3

gmp_printf("-- mpf_get_d_2exp(): a: %Ff, exp= %d, _mp_exp= %d, d_2exp= %f\n", a, exp, a->_mp_exp, d_2exp);

d_2exp = mpf_get_d_2exp(&exp, b);

gmp_printf("-- mpf_get_d_2exp(): b: %Ff, exp= %d, _mp_exp= %d, d_2exp= %f\n", b, exp, b->_mp_exp, d_2exp);

d_2exp = mpf_get_d_2exp(&exp, c);

gmp_printf("-- mpf_get_d_2exp(): c: %Ff, exp= %d, _mp_exp= %d, d_2exp= %f\n", c, exp, c->_mp_exp, d_2exp);

/* 输出:

-- mpf_init_set_str() [0:正确,-1:错误] res= 0

-- a= 0.000000, b= 3.000000, c= 5.000000, d= 7.000000, e= 300.000000, f= 8.000000, g= 19.000000

-- 加法(a=b+c): 8.000000

-- 加法(a=b+c)[精度 2]:8.00

-- 加法(a=b+f)[精度 2]:11.00

-- 加法(a=c+f)[精度 2]:13.00

-- 加法(a=g+f)[精度 2]: 27.00, _mp_prec= 2, _mp_size= 1, _mp_exp= 1, _mp_d= 27

-- 减法(a=b-c): -2.000000

-- 减法(a=b-c)[精度 2]: -2.00, _mp_prec= 2, _mp_size= -1, _mp_exp= 1, _mp_d= 2

-- 乘法(a=b*c): 15.000000

-- 乘法(a=b*c)[精度 2]: 15.00, _mp_prec= 2, _mp_size= 1, _mp_exp= 1, _mp_d= 15

-- 除法(a=b/d): 0.428571

-- 除法(a=b/d)[精度 2]: 0.43

-- 除法(a=b/d)[精度 9]: 0.428571429

-- 除法(a=b/d)[精度 10]:0.4285714286, _mp_prec=2, _mp_size=2, _mp_exp=0, _mp_d=1840700269

-- mpf_get_str(): word: exponent= 0, length= 21, word= 428571428571428571429

-- 除法(a=e/d)[精度 10]:42.8571428571

-- mpf_get_str(): word: exponent= 2, length= 21, word= 428571428571428571429

-- 幂(a=b^3)[精度 2]:27.00, _mp_prec=2, _mp_size=1, _mp_exp=1, _mp_d=27

-- 2exp(a=b* 2^0)[精度 2]:3.00, _mp_prec=2, _mp_size=1, _mp_exp=1, _mp_d=3

-- 2exp(a=b* 2^1)[精度 2]:6.00, _mp_prec=2, _mp_size=1, _mp_exp=1, _mp_d=6

-- 2exp(a=b* 2^2)[精度 2]:12.00, _mp_prec=2, _mp_size=1, _mp_exp=1, _mp_d=12

-- 2exp(a=b* 2^3)[精度 2]:24.00, _mp_prec=2, _mp_size=1, _mp_exp=1, _mp_d=24

-- 把 b 的值赋给 a, a:3.00

-- 取反,把 b 取反后的值赋给 a, a:-3.00

-- 绝对值,a:3.00

-- mpf_get_ui(): b: unsigned int ui= 3

-- mpf_get_ui(): c: unsigned int ui= 5

-- mpf_get_d_2exp(): a: 24.000000, exp= 5, _mp_exp= 1, d_2exp= 0.750000

-- mpf_get_d_2exp(): b: 3.000000, exp= 2, _mp_exp= 1, d_2exp= 0.750000

-- mpf_get_d_2exp(): c: 5.000000, exp= 3, _mp_exp= 1, d_2exp= 0.625000

-- 用时:16 ms

总结:

1、gmp_printf() 函数打印时如果不输入精度,则默认打印精度为6

2、通过 除法精度9 和 除法精度10 可以看出默认是有四舍五入的

3、通过 exponent=0 和 exponent=2,可以看出这是小数点的下标

*/

// 释放x占用的空间。完成所有mpf_t变量后,请确保为所有变量调用此函数 。

mpf_clear(a);

mpf_clear(b);

mpf_clear(c);

mpf_clear(d);

mpf_clear(e);

mpf_clear(f);

mpf_clear(g);

return 0;

}

php 浮点数 gmp计算,C/C++ gmp库之浮点数实例相关推荐

  1. JS--使用第三方库解决浮点数(小数)计算不准确的问题

    原文网址:JS--使用第三方库解决浮点数(小数)计算不准确的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决JavaScript在计算浮点数(小数)时不准确(精度丢失)的问题. 问题描述 ...

  2. Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算,没有数位限制...

    (注:前面写了一个超大整数相加的类,参见: 超大整数相加,超过了long的范围,你要怎么做!,后来有朋友评论说BigDecimal可以完全实现我的这这个功能,刚开始的时候,我还不服气,据我所知那里有这 ...

  3. 题目:任意给定一个浮点数,计算这个浮点数的立方根。(基于二分法和牛顿迭代法)(基于Java实现)

    题目:任意给定一个浮点数,计算这个浮点数的立方根.(基于二分法和牛顿迭代法)(基于Java实现) 首先,来分析一下这道题,其实在leetcode上做了求解根号3的题之后,对于这种求解立方根的题,基本上 ...

  4. 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...

  5. Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算 没有数位限制

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! (注:前 ...

  6. matlab将常值函数转换为变量,MATLAB与科学计算期末复习题题库15.11.12

    MATLAB 与科学计算期末复习题题库(第一部分) 一.填空 1.MATLAB 的主界面是一个高度集成的工作环境,有四个不同职责分工的窗口,分别 为 . . .和 窗口. 2.MATLAB 的值,应在 ...

  7. 第二章 Java浮点数精确计算

    1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用Big ...

  8. 基于python计算生态的第三方库总结与介绍

    摘要:Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域.即使在每个方向,也会有大量的专业人员开发多个第三方库来给出具体设计.正是因为python有了这么多"隐形的翅膀&quo ...

  9. python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算

    1. decimal定点数和浮点数的数学运算 decimal模块实现了定点和浮点算术运算,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模式(即大多数计算机硬件实现的IEEE浮点数运算).Decim ...

  10. python语言中浮点数_举例说明python如何生成一系列浮点数

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在这篇文章中,我将向您解释如何用python生成一系列浮点数.我已经用python写了几个示例,演示了如何 ...

最新文章

  1. NBUT校赛 J Alex’s Foolish Function(分块+延迟标记)
  2. Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
  3. linux+离线+搜狗,Ubuntu离线安装Sogou拼音(附老版本安装)
  4. mysql数据库自动重新连接_mysql数据库自动重新连接
  5. 算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。
  6. react父子组件通信案例
  7. 1102 Invert a Binary Tree(甲级)
  8. UI设计干货素材|动效导航,漂亮的悬停动效
  9. python求解在给定递减数组中寻找两个数和等于定值,乘积最小
  10. keil4注册机注册不了怎么办?我已经试过下面的注册机不行。求各大神指教一下?
  11. MySQL源码调试入门
  12. 涉密专用计算机平台,涉密计算机及移动存储介质保密管理系统(三合一)
  13. vue 综合案例todos----重要
  14. cad2006计算机丢失,win10系统无法打开CAD2006提示“计算机中丢失ac1st16.dll”的解决方法...
  15. 计算机文档我的文档丢失,我的文档不见了
  16. pip list outdated pacakge and update
  17. 接口测试用例设计:常见问题和风险
  18. win10商店打不开_win10应用商店的卸载和安装
  19. 最简单的Hopper Disassembler玩转Mac逆向
  20. asciidoc_如何使用AsciiDoc创建博客

热门文章

  1. Java8新特性笔记--波哥带你学JAVA--函数式接口
  2. 确保环网交换机的应用效果,应该怎么做?
  3. linux中文版出问题,Linux下中文输入法出现问题的排查步骤
  4. 摆脱亚健康 男人离不开的10种营养素
  5. 纺织计算机应用技术电子版,纺织业计算机技术的培养
  6. python之获得文本语料和词汇资源(3)
  7. 跟着专注于计算机视觉的AndyJ的妈妈我学机器学习-重学数理统计之假设检验
  8. android:r.string.xx 转为字符型,R语言学习7.1----stringr处理字符串
  9. 在IT管理职业生涯中 张艳力求做最好的自己
  10. [罗辑思维微信]怎样炼成世界级高手