php 浮点数 gmp计算,C/C++ gmp库之浮点数实例
#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库之浮点数实例相关推荐
- JS--使用第三方库解决浮点数(小数)计算不准确的问题
原文网址:JS--使用第三方库解决浮点数(小数)计算不准确的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决JavaScript在计算浮点数(小数)时不准确(精度丢失)的问题. 问题描述 ...
- Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算,没有数位限制...
(注:前面写了一个超大整数相加的类,参见: 超大整数相加,超过了long的范围,你要怎么做!,后来有朋友评论说BigDecimal可以完全实现我的这这个功能,刚开始的时候,我还不服气,据我所知那里有这 ...
- 题目:任意给定一个浮点数,计算这个浮点数的立方根。(基于二分法和牛顿迭代法)(基于Java实现)
题目:任意给定一个浮点数,计算这个浮点数的立方根.(基于二分法和牛顿迭代法)(基于Java实现) 首先,来分析一下这道题,其实在leetcode上做了求解根号3的题之后,对于这种求解立方根的题,基本上 ...
- 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前面已经写过一个先进先出的库龄案例,在业务发生又有这样一个需求:先进先出前提,需要按照订单计算每个商品在库时间, ...
- Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算 没有数位限制
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! (注:前 ...
- matlab将常值函数转换为变量,MATLAB与科学计算期末复习题题库15.11.12
MATLAB 与科学计算期末复习题题库(第一部分) 一.填空 1.MATLAB 的主界面是一个高度集成的工作环境,有四个不同职责分工的窗口,分别 为 . . .和 窗口. 2.MATLAB 的值,应在 ...
- 第二章 Java浮点数精确计算
1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用Big ...
- 基于python计算生态的第三方库总结与介绍
摘要:Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域.即使在每个方向,也会有大量的专业人员开发多个第三方库来给出具体设计.正是因为python有了这么多"隐形的翅膀&quo ...
- python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算
1. decimal定点数和浮点数的数学运算 decimal模块实现了定点和浮点算术运算,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模式(即大多数计算机硬件实现的IEEE浮点数运算).Decim ...
- python语言中浮点数_举例说明python如何生成一系列浮点数
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在这篇文章中,我将向您解释如何用python生成一系列浮点数.我已经用python写了几个示例,演示了如何 ...
最新文章
- NBUT校赛 J Alex’s Foolish Function(分块+延迟标记)
- Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
- linux+离线+搜狗,Ubuntu离线安装Sogou拼音(附老版本安装)
- mysql数据库自动重新连接_mysql数据库自动重新连接
- 算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。
- react父子组件通信案例
- 1102 Invert a Binary Tree(甲级)
- UI设计干货素材|动效导航,漂亮的悬停动效
- python求解在给定递减数组中寻找两个数和等于定值,乘积最小
- keil4注册机注册不了怎么办?我已经试过下面的注册机不行。求各大神指教一下?
- MySQL源码调试入门
- 涉密专用计算机平台,涉密计算机及移动存储介质保密管理系统(三合一)
- vue 综合案例todos----重要
- cad2006计算机丢失,win10系统无法打开CAD2006提示“计算机中丢失ac1st16.dll”的解决方法...
- 计算机文档我的文档丢失,我的文档不见了
- pip list outdated pacakge and update
- 接口测试用例设计:常见问题和风险
- win10商店打不开_win10应用商店的卸载和安装
- 最简单的Hopper Disassembler玩转Mac逆向
- asciidoc_如何使用AsciiDoc创建博客
热门文章
- Java8新特性笔记--波哥带你学JAVA--函数式接口
- 确保环网交换机的应用效果,应该怎么做?
- linux中文版出问题,Linux下中文输入法出现问题的排查步骤
- 摆脱亚健康 男人离不开的10种营养素
- 纺织计算机应用技术电子版,纺织业计算机技术的培养
- python之获得文本语料和词汇资源(3)
- 跟着专注于计算机视觉的AndyJ的妈妈我学机器学习-重学数理统计之假设检验
- android:r.string.xx 转为字符型,R语言学习7.1----stringr处理字符串
- 在IT管理职业生涯中 张艳力求做最好的自己
- [罗辑思维微信]怎样炼成世界级高手