C++实现浮点数精确加法

本文实例为大家分享了C++实现浮点数精确加法的具体代码,供大家参考,具体内容如下

实现两个正浮点数的精确加法

参与运算的浮点数及计算结果所需存储空间都不会超过main函数中的定义

main函数框架要求如下:

int main(){
 char num1[128],num2[128],res[128];
 cout<<"Enter the first number:";
 cin>>num1;
 cout<<"Enter the second number:";
 cin>>num2;
 add(num1,num2,res);
 cout<<num1<<'+'<<num2<<'='<<res<<endl;
 return 0;
}

C++实现:

#include <iostream>

using namespace std;

void add(char num1[], char num2[], char res[]);

int get_len(char num[]);

int get_integer(char num[]);

int get_dot(char num[]);

int get_decimal_len(char num[]);

int get_integer_len(int x);

int char_to_int(char num[], int begin, int len);

void int_to_char(char res[], int x);

void get_decimal(char num1[], char num2[]);

char decimal[128] = {0};

int main() {
 char num1[128] = {0}, num2[128] = {0}, res[128] = {0};
 cout << "Enter the first number:";
 cin >> num1;
 cout << "Enter the second number:";
 cin >> num2;
 add(num1, num2, res);
 cout << num1 << '+' << num2 << '=' << res << endl;
 return 0;
}

//获取小数点在哪一位
int get_dot(char num[]) {
 int i;
 for (i = 0; num[i] != '\0'; ++i) {
 if (num[i] == '.') {
 return i;
 }
 }
 return i;
}

//把字符串转化为整数
int char_to_int(char num[], int begins, int len) {
 int integer = 0, l = get_decimal_len(num);
 if (l < len) {
 for (int j = l; j <= len; ++j) {
 num[begins + j + 1] = '0';
 }
 }
 for (int i = 0; i < len; ++i) {
 integer = integer * 10 + num[begins + i + 1] - '0';
 }
 return integer;
}

//整数转化为字符串
void int_to_char(char res[], int x) {
 int i, l = get_integer_len(x);
 for (i = l - 1; i >= 0; --i) {
 res[i] = x % 10 + '0';
 x /= 10;
 }
 res[l + 1] = '\0';
}

//得到整数部分
int get_integer(char num[]) {
 int integer = 0, x = get_dot(num);
 for (int i = 0; i <= x - 1; ++i) {
 integer = integer * 10 + num[i] - '0';
 }
 return integer;
}

//得到小数部分长度
int get_decimal_len(char num[]) {
 int x = get_dot(num), len = 0;
 for (int i = x + 1; num[i] != '\0'; ++i)len++;
 return len;
}

//得到整数的长度
int get_integer_len(int x) {
 int integer_len = 0;
 if (x == 0)return 1;
 while (x > 0) {
 x /= 10;
 integer_len++;
 }
 return integer_len;
}

//得到字符串长度
int get_len(char num[]) {
 int sum = 0;
 for (int i = 0; num[i] != '\0'; ++i) sum++;
 return sum;
}

//得到小数变成整数后的和
void get_decimal(char num1[], char num2[]) {
 int decimal_len = get_decimal_len(num1) > get_decimal_len(num2) ? get_decimal_len(num1) : get_decimal_len(num2);
 int decimal_sum = char_to_int(num1, get_dot(num1), decimal_len) + char_to_int(num2, get_dot(num2), decimal_len);
 int_to_char(decimal, decimal_sum);
 if (decimal_len < get_integer_len(decimal_sum)) {
 for (int i = 0; decimal[i] != '\0'; ++i) {
 decimal[i] = decimal[i + 1];
 }
 }
}

void add(char num1[], char num2[], char res[]) {
 bool flag = false, zero_flag = false;
 int i;
 int l1 = get_len(num1), l2 = get_len(num2);
 get_decimal(num1, num2);
 int decimal_len = get_decimal_len(num1) > get_decimal_len(num2) ? get_decimal_len(num1) : get_decimal_len(num2);
 int decimal_sum = char_to_int(num1, get_dot(num1), decimal_len) + char_to_int(num2, get_dot(num2), decimal_len);
 if (decimal_len < get_integer_len(decimal_sum)) {
 flag = true;
 }
 int sum_int = get_integer(num1) + get_integer(num2) + flag;
 int_to_char(res, sum_int);
 *(res + get_integer_len(sum_int)) = '.';
 for (i = 1; decimal[i - 1] != '\0'; ++i) {
 *(res + get_integer_len(sum_int) + i) = decimal[i - 1];
 }
 for (i = get_dot(res) + 1; res[i] != '\0'; ++i) {
 if (res[i] != '0') {
 zero_flag = true;
 }
 }
 if (!zero_flag) {
 res[get_dot(res)] = '\0';
 } else {
 for (i = get_len(res) - 1; i > get_dot(res); --i) {
 if (res[i] == '0') {
 res[i] = '\0';
 break;
 }
 break;
 }
 }
 num1[l1] = '\0', num2[l2] = '\0';
}

总结:

  • 用整型数组来储存各个位数的数字
  • 学会进位制,悟透进位原理
  • 熟练掌握字符串数组与整型数组的相互转换
  • 学会用指针来辅助输出

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++使用string的大数加法运算(1)

    本次项目目标:使用C++完成对于大数的加法运算,供大家参考,具体内容如下 项目要点 1.大数指的是远超long long int的数据 2.将大数用矩阵进行存储,并通过矩阵实现运算 3.本人采用字符串进行存储,应注意char的特点 比如: char a=161: cout<<(int)a; 此时会输出-95,而不是161,char类型首个比特位是作为正负号的 加法,此处只做自然数加法,因为存在负整数的话可以使用自然数减法来处理 运行截图及代码如下: #include<iostream&g

  • 使用C++的string实现高精度加法运算的实例代码

    对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算. 本文讨论借助C++的string来实现高精度的运算. 首先输入的量直接存储为string,设为s1和s2. 接下来设计一个反转函数,用于把整个字符串反转(为了方便后续计算). string reverseStr(string input){ string output = ""; for(int i = 0; i < input.length(); i++){

  • c++实现高精度加法

    最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以字符数组的形式输入,建立字符数组,建立相应的整数数组,然后一一映射,以此来实现数据的输入,需要注意的是,当实现字符向数字映射时,应该减去相应的ASCII偏移值,即48. 2:为了模拟我们在纸上手算的进位模拟运算,我们将字符数组反向填入整数数组,上图的后几行代码实现了这个操作. 3:实现进位加法,这是整个代码的核心部分,需

  • c++加法高精度算法的简单实现

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就是把数组编程字符串,然后将字符串像竖式一样加起来: a+b高精度算法 #include <iostream> #include <cmath> #include <cstring> using namespace std; int main() { char a[10001

  • C++稀疏矩阵的各种基本运算并实现加法乘法

    代码: #include <iostream> #include<malloc.h> #include<cstdio> using namespace std; #define M 4 #define N 4 #define MaxSize 100 typedef int ElemType; typedef struct { int r; int c; ElemType d;///元素值 } TupNode; ///三元组定义 typedef struct { int

  • C++单链表实现大数加法

    本文实例为大家分享了C++单链表实现大数加法,供大家参考,具体内容如下 Input Format 输入文件包括两行. 第一行包括一个正整数,保证位数不超过1000000. 第二行包括一个正整数,保证位数不超过1000000. Output Format 输出文件包括一行. 第一行包括一个正整数. Sample Input 10558 22 Sample Output 10580 #include <iostream> using namespace std; class BigData { f

  • 详解C++语言中的加法运算符与赋值运算符的用法

    加法运算符:+ 和 - 语法 expression + expression expression – expression 备注 相加运算符为: 加 (+) 减 (–) 这些二进制运算符具有从左至右的关联性. 相加运算符采用算术或指针类型的操作数.加法 (+) 运算符的结果是操作数之和.减法 (–) 运算符的结果是操作数之差.如果一个操作数是指针或两个操作数都是指针,则它们必须是指向对象的指针,而不是指向函数的指针.如果两个操作数都是指针,则结果没有意义,除非它们是指向同一数组中的对象的指针.

  • C++中实现矩阵的加法和乘法实例

    C++中实现矩阵的加法和乘法实例 实现效果图: 实例代码: #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;//保存二维数组的元素 public: Matrix();//默认构造函数 Matrix(int r, int c); Matrix(const Matrix &is);//拷贝构造函数 void Madd(const Matrix &

  • C++实现浮点数精确加法

    本文实例为大家分享了C++实现浮点数精确加法的具体代码,供大家参考,具体内容如下 实现两个正浮点数的精确加法 参与运算的浮点数及计算结果所需存储空间都不会超过main函数中的定义 main函数框架要求如下: int main(){ char num1[128],num2[128],res[128]; cout<<"Enter the first number:"; cin>>num1; cout<<"Enter the second num

  • js浮点数精确计算(加、减、乘、除)

    复制代码 代码如下: <SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.   //调用:accAdd(arg1,arg2)   //返回值:arg1加上arg2的精确结果   function accAdd(arg1,arg2){      var r1,r2,m;      try{r1=arg1.toString().split(".&

  • 简单谈谈php浮点数精确运算

    bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1

  • Java中使用BigDecimal进行精确运算

    首先我们先来看如下代码示例: public class Test_1 { public static void main(String[] args) { System.out.println(0.06+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(303.1/1000); } } 运行结果如下. 0.06999999999999999 0.58000000000000

  • 使用BigDecimal进行精确运算(实现加减乘除运算)

    首先我们先来看如下代码示例: 复制代码 代码如下: public class Test_1 {public static void main(String[] args) {System.out.println(0.06+0.01);System.out.println(1.0-0.42);System.out.println(4.015*100);System.out.println(303.1/1000);}} 运行结果如下0.06999999999999999 0.580000000000

  • PHP精确计算功能示例

    本文实例讲述了PHP精确计算功能.分享给大家供大家参考,具体如下: 引言:一定要确保数据的准确性.这是一个好的程序员的基本素养. <?php /** * 精确加法 * @param [type] $a [description] * @param [type] $b [description] */ function math_add($a,$b,$scale = '2') { return bcadd($a,$b,$scale); } /** * 精确减法 * @param [type] $a

  • js常用自定义公共函数汇总

    复制代码 代码如下: String.prototype.trim = function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); } //检查是否是日期格式 function isDate(datestr){ var result = datestr.match(/((^((1[8-9]\d{2})|([2-9]\d{3}))(-)(10|12|0?[13578])(-)(3[01]|[12][0-9]|0?[1-9])$)|(^((1

  • Java编程BigDecimal用法实例分享

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

  • 详解Angular的内置过滤器和自定义过滤器【推荐】

    在实际的开发过程中,很多後端返回给我们的数据都是需要格式化处理的,在angular中为我们内置提供了filter指令,可以很方便的对数据进行处理.首先我们看看在视图中是如何使用过滤器的. 1.currency(货币)格式化 <div ng-controller="Aaa"> <p>{{name | currency:'¥'}}</p> </div> <script type="text/javascript"&g

  • 跟我学习javascript的循环

    1.优先使用数组而不是Object类型来表示有顺序的集合 ECMAScript标准并没有规定对JavaScript的Object类型中的属性的存储顺序. 但是在使用for..in循环对Object中的属性进行遍历的时候,确实是需要依赖于某种顺序的.正因为ECMAScript没有对这个顺序进行明确地规范,所以每个JavaScript执行引擎都能够根据自身的特点进行实现,那么在不同的执行环境中就不能保证for..in循环的行为一致性了. 比如,以下代码在调用report方法时的结果就是不确定的: f

随机推荐