# 高精度计算器(精确显示版)
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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



