簡體   English   中英

具有 MPFR 的不同精度的次正規數

[英]Subnormal numbers in different precisions with MPFR

我想模擬各種n位二進制浮點格式,每種格式都有指定的e_maxe_min ,精度為p位。 我希望這些格式能夠模擬次正規數,忠實於 IEEE-754 標准。

自然地,我的搜索使我找到了 MPFR 庫,它符合 IEEE-754 標准,並且能夠通過mpfr_subnormalize()函數支持次mpfr_subnormalize() 但是,我在使用mpfr_set_emin()mpfr_set_emax()正確設置非正常啟用環境時遇到了一些困惑。 我將使用 IEEE 雙精度作為示例格式,因為這是 MPFR 手冊中使用的示例:

http://mpfr.loria.fr/mpfr-current/mpfr.html#index-mpfr_005fsubnormalize

mpfr_set_default_prec (53);
mpfr_set_emin (-1073); mpfr_set_emax (1024);

上面的代碼來自上面鏈接中的 MPFR 手冊 - 請注意, e_maxe_min都不等於double的預期值。 這里, p被設置為 53,正如預期的double類型,但是e_max被設置為 1024,而不是正確的值 1023,並且e_min被設置為 -1073; 遠低於 -1022 的正確值。 我知道在 MPFR 的中間計算中將指數邊界設置得太緊會導致上溢/下溢,但我發現准確設置e_min對於確保正確的次正規數至關重要; 太高或太低會導致低於正常的 MPFR 結果(用mprf_subnormalize()更新)與相應的double結果不同。

我的問題是應該如何決定將哪些值傳遞給mpfr_set_emax()和(尤其是) mpfr_set_emin() ,以保證具有指數邊界e_maxe_min的浮點格式的正確次正常行為? 似乎沒有關於此事的任何詳細文檔或討論。

衷心感謝,

詹姆斯。

編輯 30/07/16:這是一個小程序,它演示了單精度數的e_maxe_min的選擇。

#include <iostream>
#include <cmath>
#include <float.h>
#include <mpfr.h>

using namespace std;

int main (int argc, char *argv[]) {
    cout.precision(120);

    // IEEE-754 float emin and emax values don't work at all
    //mpfr_set_emin (-126);
    //mpfr_set_emax (127);

    // Not quite
    //mpfr_set_emin (-147);
    //mpfr_set_emax (128);

    // Not quite
    //mpfr_set_emin (-149);
    //mpfr_set_emax (128);

    // These float emin and emax values work in subnormal range
    mpfr_set_emin (-148);
    mpfr_set_emax (128);

    cout << "emin: " << mpfr_get_emin() << "    emax: " << mpfr_get_emax() << endl;

    float f = FLT_MIN;
    for (int i = 0; i < 3; i++) f = nextafterf(f, INFINITY);

    mpfr_t m;
    mpfr_init2 (m, 24);
    mpfr_set_flt (m, f, MPFR_RNDN);

    for (int i = 0; i < 6; i++) {
        f = nextafterf(f, 0);
        mpfr_nextbelow(m);
        cout << i << ": float: " << f << endl;
        //cout << i << ":  mpfr: " << mpfr_get_flt (m, MPFR_RNDN) << endl;
        mpfr_subnormalize (m, 1, MPFR_RNDN);
        cout << i << ":  mpfr: " << mpfr_get_flt (m, MPFR_RNDN) << endl;
    }

    mpfr_clear (m);
    return 0;
}

我正在復制我在 ResearchGate 上給出的答案(帶有指向mpfr_subnormalize文檔的鏈接):

有不同的約定來表示有效數和相關的指數。 IEEE 754 選擇考慮 1 和 2 之間的有效數,而 MPFR(如 C 語言,例如參見DBL_MAX_EXP )選擇考慮 1/2 和 1 之間的有效數(出於與多精度相關的實際原因)。 例如,數字 17 在 IEEE 754 中表示為 1.0001·2 4 ,在 MPFR 中表示為 0.10001·2 5 如您所見,這意味着與 IEEE 754 相比,MPFR 中的指數增加了 1,因此 e max = 1024 而不是雙精度的 1023。

關於雙精度e min的選擇,需要能夠表示2 -1074 = 0.1·2 -1073 ,因此e min最多需要為-1073(如在MPFR中,所有數字都被歸一化)。

如文檔所述, mpfr_subnormalize函數認為次正規指數范圍是從 e min到 e min + PREC(x) − 1,因此例如,您需要設置 e min = −1073 以模擬 IEEE 雙精度。

暫無
暫無

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

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