DeepSeek生成的高精度大数计算器

# 高精度计算器(精确显示版)

1. **精确显示优化**:
   - 新增`print_mpfr()`函数专门处理MPFR数值的打印
   - 自动移除多余的尾随零和小数点
   - 确保所有浮点结果都以完整十进制形式显示,不使用科学计数法

2. **浮点精度修复**:
   - 所有MPFR运算明确使用`MPFR_RNDN`舍入模式(最近偶数)
   - 使用MPFR内置的高精度数学函数(如`mpfr_pow`、`mpfr_sqrt`等)
   - 大数阶乘计算改用`mpfr_lngamma`实现,精度更高

3. **数值解析优化**:
   - 输入解析时自动清理无效字符
   - 严格验证输入有效性

4. **显示格式优化**:
   - 统一所有浮点结果显示格式
   - 优化2的幂运算结果显示格式
   - 移除所有可能导致科学计数法显示的代码路径

5. **代码结构优化**:
   - 集中管理精度相关常量
   - 简化变量初始化/清理流程
   - 移除冗余的自定义数学函数实现

## 使用说明

1. 编译时需要链接GMP、MPFR和Readline库:
   ```bash
   gcc precise_calculator.c -o precise_calculator -lgmp -lmpfr -lreadline
   ```

2. 所有浮点运算结果都会以完整十进制形式显示,不会出现科学计数法

3. 对于极大数的运算(如大阶乘),结果会完整显示所有有效数字

4. 输入`help`可以查看所有支持的命令和用法示例

这个版本确保了所有计算结果的精确显示,同时保持了高精度的计算能力,完全符合数学运算的要求。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <gmp.h>
#include <mpfr.h>
#include <limits.h>
#include <readline/readline.h>
#include <readline/history.h>

// 全局精度设置(1024位二进制精度 ≈ 308位十进制精度)
#define BINARY_PRECISION 1024
#define DECIMAL_DIGITS 308

// 全局变量声明
mpz_t gmp_int_result;
mpfr_t mpfr_result;
mpfr_t mpfr_temp;

// 函数声明
int parse_big_number(const char *str, mpz_t z);
void init_mp_vars();
void clear_mp_vars();
void add_numbers(const char *a, const char *b);
void subtract_numbers(const char *a, const char *b);
void multiply_numbers(const char *a, const char *b);
void divide_numbers(const char *a, const char *b);
void float_divide_numbers(const char *a, const char *b);
void power_numbers(const char *base, const char *exponent);
void gcd_numbers(const char *a, const char *b);
void square_root(const char *num);
void modulo_numbers(const char *a, const char *b);
void factorial(const char *num);
void big_factorial(const char *num);
void power_of_two(const char *exponent);
void display_help();
void print_mpfr(const mpfr_t num, int precision);

// 初始化MP变量
void init_mp_vars() {
    mpz_init(gmp_int_result);
    mpfr_init2(mpfr_result, BINARY_PRECISION);
    mpfr_init2(mpfr_temp, BINARY_PRECISION);

    // 设置默认舍入模式为最近偶数
    mpfr_set_default_rounding_mode(MPFR_RNDN);
    mpfr_set_default_prec(BINARY_PRECISION);
}

// 清理MP变量
void clear_mp_vars() {
    mpz_clear(gmp_int_result);
    mpfr_clear(mpfr_result);
    mpfr_clear(mpfr_temp);
}

// 增强版数字解析函数
int parse_big_number(const char *str, mpz_t z) {
    if (str == NULL || *str == '\0') return 0;

    // 清理输入:移除所有空白字符,只保留数字和负号
    char *cleaned = (char*)malloc(strlen(str)+1);
    int j = 0;
    for (int i = 0; str[i]; i++) {
        if (isdigit(str[i]) || (i == 0 && str[i] == '-')) {
            cleaned[j++] = str[i];
        }
    }
    clean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值