簡體   English   中英

是否有庫 class 來表示浮點數?

[英]Is there a library class to represent floating point numbers?

我正在編寫一個應用程序,它對十進制數字(例如 57.65)進行大量操作。 由於乘法和除法會迅速侵蝕它們的准確性,我想將數字存儲在 class 中,這樣可以在操作后保持其准確性,而不是依賴 float 和 double。

我說的是這樣的事情:

class FloatingPointNumber {
private:
    long m_mantissa;
    int m_dps; // decimal points
    // so for example 57.65 would be represented as m_mantissa=5765, m_dps=2
public:
    // Overloaded function for addition
    FloatingPointNumber operator+(FloatingPointNumber n);
    // Other operator overloads follow
}

雖然我可以編寫這樣的 class,但感覺有點像重新發明輪子,我確信一定有某個庫 class 可以執行此操作(盡管這在 STL 中似乎不存在)。

有人知道這樣的圖書館嗎? 非常感謝。

你的意思是這樣的嗎?

#include "ttmath/ttmath.h"
#include <iostream>

int main()
{
   // bigdouble consists of 1024*4 bytes for the mantissa
   // and 256*4 bytes for the exponent.
   // This is because my machine is 32-bit!
    typedef ttmath::Big<1024, 256> bigdouble; // <Mantissa, Exponent>

    bigdouble x = 5.05544;
    bigdouble y = "54145454.15484854120248541841854158417";
    bigdouble z = x * y * 0.01;

    std::cout << z;

    return 0;
}

您可以根據需要指定尾數中機器字數指數 我使用TTMath來解決Project Euler難題,我對它非常滿意。 我認為這是相對穩定的,如果你有疑問,作者非常友好。


編輯::我過去也使用過MAPM 它表示基數為100的大浮點數,因此將十進制數轉換為基數為100將沒有問題,與基數2不同.TTMAT使用基數2來表示大浮點數。 自圖書館頁面聲稱,它自2000年以來一直保持穩定。 它已在許多應用程序中使用,您可以在庫頁面中看到它。 它是一個帶有漂亮的C ++包裝器的C庫。

MAPM nextPrime(){

    static MAPM prime = 3;
    MAPM retPrime = prime;

    prime += 2;
    while( isPrime( prime ) == false )
        prime += 2;

    return retPrime;
}

順便說一句,如果你有興趣在GMP和你正在使用VS,那么你可以檢查MPIR這是GMP端口的Windows;)對我來說,我覺得TTMath比賞心悅目,更容易/比所有的東西我想是因為該庫確實快了堆棧分配,無論如何都不會觸及堆。 基本上它不是一個任意的精度庫,你在編譯時指定精度,如上所示。

有庫的列表在這里

我從來沒有嘗試過任何一個,所以我不能推薦一個,但是這個是GNU項目的一部分所以它不能一半壞。

如果你想自己動手, Binary Coded Decimal可能是你最好的選擇。

我沒有使用這些庫的經驗,但就意識而言,我認為在過去幾年中有兩個與這個問題相關的重大發展......

  1. “posits”——一種新的浮點格式,比 IEEE754 更高效、更“混亂”。
  2. C# 11 引入了“靜態抽象接口成員”,它允許(為了我們的目的)實現新的數字類型,同時在運算符重載等方面獲得內置數字類型的所有相同好處......即真正的通用數字類型C#。

我知道 C# 中沒有“posits”的實現,也沒有發布 C# 11。 但同樣——這些是與該問題相關的顯着發展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM