首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

突破基本型別極限:C/C++ 處理超長整數與高精度浮點數完全指南

     編輯:關於C

為什麼基本型別不夠用?

C/C++ 內建型別受限於位寬:

  • float:32 位,約 7 位有效數字,範圍 ~10±38
  • double:64 位,約 15-16 位有效數字,範圍 ~10±308
  • long 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++業界標準,極快,支援整數/有理數/浮點數
MPFRC基於 GMP,正確捨入的高精度浮點數
Boost.MultiprecisionC++Header-only,語法接近內建型別,cpp_int/cpp_dec_float
OpenSSL BIGNUMC密碼學導向,大整數模運算極快

Boost.Multiprecision 範例

#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;
}

方案三:VC6/Windows 專屬 __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零依賴、相容舊工具鏈

總結

  • 基本型別精度有限,有效數字 ≠ 數值範圍,超精度運算會靜默丟失低位。
  • 字串/陣列模擬最通用、可移植,適合教學與無依賴環境。
  • 現代 C++ 專案首選 Boost.Multiprecision(Header-only、標準語法);高效能場景用 GMP/MPFR。
  • 舊環境 (VC6) 可用 __int64 + 字串轉換湊合 20 位以內需求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved