c++高精度计算20除法High-precision20calculate240101

本文介绍了在C++中实现高精度计算的方法,特别是如何利用MPFR库来确保至少100位精度的计算,例如计算sin(π/6)。对于嵌入式设备编程,文中建议从头开始构建大数的加减乘除操作来实现高精度计算库。
摘要由CSDN通过智能技术生成

要在C++中实现高精度和高性能的计算,
比如要计算 sin⁡(π6)sin(6π​) 至少100位的精度,你可以考虑使用如GNU Multiple Precision Arithmetic Library (GMP) 或者MPFR库来处理高精度数学运算。MPFR库是专门为了提供一个可靠的多精度浮点数计算平台,能够保证结果的准确性,包括四舍五入的控制。

下面是一个使用MPFR库在C++中计算 sin⁡(π/6)即sin(π/6​) 的示例代码,假设你已经正确安装了MPFR库:

……

如果你给嵌入式设备编程,当然就不能使用大规模的数学计算库,这时候……需要:
为实现一个基本的 高精度计算 c++库,应该从最基本的

大数的 加减乘除 撸起……

//大整数计算器:加减乘除
#include <iostream> // 用于输入输出
#include <string>   // 用于处理字符串
using namespace std;
// 定义一个表示大整的类,使用字符串来存储数字
class BigInteger {
private:
    std::string number; // 数字以字符串形式逆序存储

public:
    // 构造函数,初始化大整数
    BigInteger(const std::string& num) : number(num) {
        // 构造函数中不对字符串进行逆序,以保持原始顺序
    }

    // 将大整数转换成字符串形式
    std::string toString() const {
        std::string result = number;
        // toString函数中也不进行逆序,直接返回结果
        return result.empty() ? "0" : result; // 如果字符串为空,则返回"0"
    }

    // 实现大整数的加法
    BigInteger add(const BigInteger& other) const {
        std::string result = "";
        int carry = 0; // 进位
        int maxLength = std::max(number.length(), other.number.length()); // 获取最长的数字长度

        for (int i = 0; i < maxLength || carry; ++i) {
            // 从字符串最后一位开始逐位取出数字进行加法
            int digit1 = i < number.length() ? number[number.length() - 1 - i] - '0' : 0;
            int digit2 = i < other.number.length() ? other.number[other.number.length() - 1 - i] - '0' : 0;
            int sum = digit1 + digit2 + carry; // 计算总和
            result = char((sum % 10) + '0') + result; // 计算当前位的值,并添加到结果字符串前
            carry = sum / 10; // 计算进位
        }

        return BigInteger(result);
    } 实现大整数的加法

    // 实现大整数的减法
    BigInteger subtract(const BigInteger& other) const {
        std::string result = "";
        int borrow = 0; // 借位
        for (int i = 0; i < number.length(); ++i) 
        {//for1100
            // 从字符串最后一位开始逐位取出数字进行减法
            int digit1 = number[number.length() - 1 - i] - '0';
            int digit2 = i < other.number.length() ? other.number[other.number.length() - 1 - i] - '0' : 0;
            int diff = digit1 - digit2 - borrow; // 计算差值
            if (diff < 0) {
                diff += 10;
                borrow = 1; // 需要借位
            }
            else {
                borrow = 0;
            }
            result = char(diff + '0') + result; // 将当前位的结果添加到结果字符串前
        }//for1100

        // 移除结果前的所有零
        size_t firstNonZero = result.find_first_not_of('0');
        if (firstNonZero != std::string::npos) {
            result = result.substr(firstNonZero);
        }
        else {
            result = "0";
        }

        return BigInteger(result);
    }// 实现大整数的减法


    // 实现大整数的乘法
    BigInteger multiply(const BigInteger& other) const {
        int n = number.length();
        int m = other.number.length();
        std::string result(n + m, '0'); // 初始化结果为0,长度为两个数长度之和

        // 从个位开始逐位相乘
        for (int i = n - 1; i >= 0; i--) {
            for (int j = m - 1; j >= 0; j--) {
                int mul = (number[i] - '0') * (other.number[j] - '0'); // 计算乘积
                int sum = (result[i + j + 1] - '0') + mul; // 加上之前的进位

                result[i + j + 1] = sum % 10 + '0'; // 更新当前位
                result[i + j] += sum / 10; // 更新进位
            }
        }

        // 移除前导零
        size_t startpos = result.find_first_not_of('0');
        if (string::npos != startpos) {
            return BigInteger(result.substr(startpos));
        }
        return BigInteger("0");
    }

    // 比较两个大整数的大小
    bool isLessThan(const BigInteger& other) const {
        // 首先比较长度,长度短的数字小
        if (number.length() != other.number.length()) {
            return number.length() < other.number.length();
        }
        // 长度相同,逐位比较
        for (int i = 0; i < number.length(); ++i) {
            if (number[i] != other.number[i]) {
                return number[i] < other.number[i];
            }
        }
        return false; // 如果完全相同,则返回假
    }

    // 实现大整数的除法
    std::pair<BigInteger, BigInteger> divide(const BigInteger& divisor) const {
        if (divisor.number == "0") {
            throw std::invalid_argument("Divisor cannot be zero."); // 除数不能为0
        }

        BigInteger dividend = *this; // 被除数
        BigInteger quotient("0"); // 商
        BigInteger remainder("0"); // 余数
        for (int i = 0; i < dividend.number.length(); ++i) 
        {//for1100
            remainder.number += dividend.number[i]; // 将被除数的每一位加到余数上
            int count = 0;
            // 当余数不小于除数时,执行减法,并计数
            while (!remainder.isLessThan(divisor)) {
                remainder = remainder.subtract(divisor);
                ++count;
            }
            quotient.number += std::to_string(count); // 将计数添加到商的结果中
        }//for1100

        // 移除商结果前的所有零
        size_t firstNonZero = quotient.number.find_first_not_of('0');
        if (firstNonZero != std::string::npos) 
        {//for1200
            quotient.number = quotient.number.substr(firstNonZero);
        }
        else {
            quotient.number = "0";
        }//for1200else1200

        // 如果余数为空,设置为"0"
        if (remainder.number.empty()) { remainder.number = "0";}

        return { quotient, remainder };
    }// 实现大整数的除法
};  //class BigInteger

int main() {
    BigInteger num1("1235"); // 初始化被除数
    BigInteger num2("12");   // 初始化除数
    cout << "Num1:" << num1.toString() << endl;
    cout << "Num2;" << num2.toString() << endl;

    BigInteger r2 = num1.add(num2);
    cout << "Add:" << r2.toString() << endl;
    r2 = num1.subtract(num2);
    cout << "Subtract:" << r2.toString() << endl;

    // 试验乘法
    BigInteger product = num1.multiply(num2);
    cout << "Multiply: " << product.toString() << endl;

    std::pair<BigInteger, BigInteger> result = num1.divide(num2); // 执行除法运算
    // 输出商和余数
    std::cout << "Quotient: " << result.first.toString() << std::endl;
    std::cout << "Remainder: " << result.second.toString() << std::endl;
    return 0;
}//main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值