C/C++ 內建型別受限於位寬:
float:32 位,約 7 位有效數字,範圍 ~10±38double:64 位,約 15-16 位有效數字,範圍 ~10±308long double:通常 80 位(x87)或 128 位,約 18-19 位有效數字unsigned long long / __int64:64 位整數,最大 ~1.84×1019 (20 位)關鍵區別:有效數字位數 ≠ 數值範圍。float 能表示 3.4×1038,但只能精確區分前 6-7 位數字;超過精度的低位會因二進制捨入而丟失,非四捨五入。
將每位數字存為字元,自行實作加減乘除、比較、輸入輸出。優點:精度無上限、邏輯直觀;缺點:效率較低、代碼量大。
typedef struct {
char digits[MAX_DIGITS]; // 低位在前或後,自行定義
int length;
bool negative;
int decimal_pos; // 小數點位置(定點數表示)
} BigNumber;
void big_add(BigNumber* a, BigNumber* b, BigNumber* res) {
int carry = 0, i = 0;
// 對齊小數點(略)
for (; i < max_len; i++) {
int sum = a->digits[i] + b->digits[i] + carry;
res->digits[i] = sum % 10;
carry = sum / 10;
}
// 處理進位...
}
| 庫 | 語言 | 特點 |
|---|---|---|
| GMP (GNU Multiple Precision) | C/C++ | 業界標準,極快,支援整數/有理數/浮點數 |
| MPFR | C | 基於 GMP,正確捨入的高精度浮點數 |
| Boost.Multiprecision | C++ | Header-only,語法接近內建型別,cpp_int/cpp_dec_float |
| OpenSSL BIGNUM | C | 密碼學導向,大整數模運算極快 |
#include
#include
#include
using boost::multiprecision::cpp_int;
using boost::multiprecision::cpp_dec_float_50; // 50 進位精度
int main() {
cpp_int huge = 1;
for (int i = 1; i <= 100; ++i) huge *= i; // 100!
std::cout << "100! = " << huge << "\n";
cpp_dec_float_50 pi = acos(cpp_dec_float_50(-1));
std::cout << "π ≈ " << pi << "\n";
return 0;
}
__int64 + 字串轉換若僅需 20 位以內整數,MSVC 提供 unsigned __int64 及轉換函數:
unsigned __int64 n = 18446744073709551615ULL; // 2^64-1
char buf[65];
_ui64toa(n, buf, 10); // 十進制字串
printf("%s\n", buf);
注意:printf 格式字串 %I64d 在舊版 MSVC 僅支援到 ~9.22×1018,超過會輸出錯誤;_ui64toa 較可靠。
標準庫提供 _itoa、_i64toa、_ui64toa(非標準但廣泛支援),可將整數轉任意進制字串:
char buf[65];
_itoa(12, buf, 2); // "1100"
_i64toa(-1LL, buf, 16); // "FFFFFFFFFFFFFFFF"
輸出範例(摘自原文測試):
base 10: -1 (2 chars) base 2: 11111111111111111111111111111111 (32 chars) base 16: FFFFFFFF (8 chars)
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 競賽程式/演算法題 | 手寫字串大數 / Boost.Multiprecision | 無外部依賴、語法簡潔 |
| 科學計算/金融高精度 | GMP + MPFR / Boost.Multiprecision | 正確捨入、效能極佳 |
| 密碼學/區塊鏈 | OpenSSL BIGNUM / libsodium | 模指數、素數測試優化 |
| 嵌入式/無標準庫 | 手寫定點數/大數 | 可控記憶體、無動態分配 |
| 舊專案維護 (VC6) | __int64 + _ui64toa | 零依賴、相容舊工具鏈 |
__int64 + 字串轉換湊合 20 位以內需求。