簡體   English   中英

浮點數/雙數的小數位數

[英]Number Of Digits in Fractional Portion of Float/Double

我正在嘗試實施http://www.exploringbinary.com/correct-decimal-to-floating-point-using-big-integers/

我已經閱讀了很多次,對此感到非常自在。 第一步假設該值是字符串格式。 我的實現假設該值是雙精度格式。

是否可以獲得構成浮點數/雙精度數小數部分的位數?

例如,值3.24325(我希望不能完全用二進制表示,因為我只是隨機選擇了它)。 我想知道小數部分是5位數字,以便我可以繼續上面鏈接中的算法。

乍看之下,使用類似modf結果似乎是正確的分數值,但實際上是四舍五入的(假設分數部分不能用二進制精確表示)。 從原始值中減去原始值的類型轉換int會得到相同的四舍五入小數。 用sprintf將值記錄在字符串中會導致類似的問題(我相信),但是我沒有足夠的時間來確認這一點-我才開始玩它。

在上面的鏈接中,該算法的步驟1是否有解決方案?

謝謝。

一種選擇是將sprintfstrchr一起使用。 下面是一個示例:

int main() {
    double d = 3.24325;
    char str[20];
    sprintf(str, "%.10f", d); 
    puts(str); 
    int digits = strchr(str, '0') - strchr(str, '.') - 1;
    printf("%d", digits);
}

產量

3.2432500000
5

在上面的代碼中, strchr搜索的位置. 和(第一個尾隨的) 0 ,並根據它計算數字。 為了簡化演示,我在%.10f后面附加了一些0 您可以通過比較strchr是否將指針返回到字符串的末尾來針對沒有尾隨0的情況來調整計算。

以下是解決問題的幼稚方法。 在大多數情況下,這是可行的,但是浮點整數表示可能會導致錯誤。

#include <stdio.h>
#include <math.h>
    #define eps 0.000001
    int main(){

        double inp=3.12456789;

        int fdigits=0;
        while(fabs(round(inp)-inp)>eps){
            printf("dif %f\n",fabs(round(inp)-inp));
            inp=inp*10;
            fdigits++;

        }
        printf("%d",fdigits);
    return 0;
    }

暫無
暫無

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

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