c++高精度减法浮点型
时间: 2023-07-05 07:15:44 浏览: 135
对于浮点数的高精度减法,可以将浮点数转化为字符串,然后按照高精度减法的思路进行计算,最后再将结果转化为浮点数。
以下是一个使用字符串实现高精度减法的例子:
```c++
#include <iostream>
#include <string>
#include <algorithm> // for reverse()
using namespace std;
string float_sub(string a, string b) {
int lena = a.length(), lenb = b.length();
int dotPosa = a.find('.'), dotPosb = b.find('.');
int lenDeca = (dotPosa == -1 ? 0 : lena - dotPosa - 1);
int lenDecb = (dotPosb == -1 ? 0 : lenb - dotPosb - 1);
// 补足小数点后的0
if (lenDeca < lenDecb) {
a.append(lenDecb - lenDeca, '0');
} else if (lenDecb < lenDeca) {
b.append(lenDeca - lenDecb, '0');
}
// 补足小数点前的0
if (dotPosa < dotPosb) {
a.insert(0, dotPosb - dotPosa, '0');
} else if (dotPosb < dotPosa) {
b.insert(0, dotPosa - dotPosb, '0');
}
// 对齐后的长度
int len = max(lena, lenb);
// 去掉小数点
a.erase(dotPosa, 1);
b.erase(dotPosb, 1);
// 翻转字符串方便计算
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
// 计算
string c(len, '0');
int carry = 0;
for (int i = 0; i < len; i++) {
int numa = (i < lena ? a[i] - '0' : 0);
int numb = (i < lenb ? b[i] - '0' : 0);
int numc = numa - numb - carry;
if (numc < 0) {
numc += 10;
carry = 1;
} else {
carry = 0;
}
c[i] = numc + '0';
}
// 去掉前导0
while (c.length() > 1 && c.back() == '0') {
c.pop_back();
}
// 加上小数点
int lenDec = max(lenDeca, lenDecb);
if (lenDec > 0) {
c.insert(len - lenDec, ".");
}
// 翻转回来
reverse(c.begin(), c.end());
return c;
}
int main() {
string a = "123.456";
string b = "78.9";
string c = float_sub(a, b);
cout << c << endl;
return 0;
}
```
这个例子中,我们首先将小数点后的0补足,然后将小数点前的0也补足,接着去掉小数点,翻转字符串,进行高精度减法计算,再去掉前导0,加上小数点,最后翻转回来,得到最终结果。
阅读全文