2016-07-05 41 views
1

鑑於這種代碼,我的教授給了我們在考試中,這意味着我們不能修改其他庫的代碼,也沒有使用功能(除stdio.h中):從浮整數

float x; 

(suppose x NOT having an integer part) 
while (CONDITION){ 
    x = x*10 
} 

我要找到條件,確保x沒有有效數字在小數點右邊沒有注意浮點數的精度問題(小數點後面我們只有零)。我想這個條件:

while ((fmod((x*10),10))){ 
    X = X*10 
} 
printf(" %f ",x); 

例如:

INPUT x=0.456; --------> OUTPUT: 456.000 
INPUT X=0.4567;--------> OUTPUT; 4567.000 
It is important to be sure that after the decimal point we don't have any   
significant number 

但我必須包括文件math.h庫,但我的教授不允許我們在這種特殊情況下使用它(我不是甚至允許使用(很長),因爲我們在課堂上從未見過它)。

那麼沒有這個庫,解決問題的條件是什麼?

+2

這通常是沒有意義的,因爲浮點不能準確地代表了大多數的數字,將有儘可能多的十進制數字,因爲它的總精度。 – 2501

+0

你可以學習['float' type](https://en.wikipedia.org/wiki/IEEE_754-1985t)並對內部比特進行一些測試 – purplepsycho

+1

_我甚至不允許使用(很長),因爲我們從未見過它在課堂上_這是沒有意義的....演員是最簡單的方式來做到這一點,雖然,@ 2501已經寫道,是不準確的。 – LPs

回答

0

有模糊性( 「沒有注意浮點數的精度問題」),但我想下面是一個尋求的答案,將x分配給一個整數類型,直到x不再有小數部分。

此方法的成功取決於INT_MIN <= x <= INT_MAX。當float的有效位中的位數不超過int的值位時,這是預期的。儘管這很常見,但並未由C指定。作爲替代,代碼可以使用更寬的整數類型,如long long,而範圍限制問題的可能性要小得多。

考慮到與*10推出了四捨五入,這種方法是不float了良好的基礎文本轉換。

float Dipok(float x) { 
    int i; 
    while ((i=x) != x) { 
     x = x*10; 
    } 
    return x; 
} 

#include <assert.h> 
#include <stdio.h> 
#include <float.h> 

void Dipok_test(float x) { 
    // suppose x NOT having an integer part 
    assert(x > -1.0 && x < 1.0); 
    float y = Dipok(x); 
    printf("x:%.*f y:%.f\n", FLT_DECIMAL_DIG, x, y); 
} 

int main(void) { 
    Dipok_test(0.456); 
    Dipok_test(0.4567); 
    return 0; 
} 

輸出

x:0.456000000 y:456 
x:0.456699997 y:4567 
+0

...和'Dipok_test(0.001);'在我的機器上產生'x:0.001000 y:10000001'。 –

+0

另請參閱http://ideone.com/lf3sQv –

+1

@undur_gongor使用[binary32](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)格式的典型'float',其中float x = 0.001 '會將'x'設置爲'0.001000000047497451305389404296875'的確切值。 「Dipok(float x)'接收到的是這個值。鑑於OP規定「不注意浮點數的精度問題」,「10000001」的答案是確定的。 OP當然會將它用作其他應用程序的基礎,並將使用'while((i = x)!= x)'的循環計數來進一步處理'100','10000001'等。 – chux

0

正如2501已經指出,這是不可能的。

浮球並不準確。實際上,取決於您的平臺,0.001的浮點值表示爲類似0.0010000001之類的值。

您希望計算的代碼是什麼:10000001或1?

任何解決方案只適用於某些值。

+0

典型的'float'具有6位數以上的_relative_小數精度。他們的價值是確切的。問題在於'floats'上的許多_operations會發生四捨五入的結果,例如float x = 0.001;'的賦值。 – chux

2

正如在此間指出,以前:由於彩車的準確性,這是不是真的有可能,但我認爲想要得到的東西像

while (x - (int)x != 0) 

while (x - (int)x >= 0.00000001) 

你可以擺脫你的教授通過使用g修飾符而不是f代替0:

printf(" %g \n",x); 
+1

如果實際浮動值略小於預期浮動值,這將失敗。 –

0

我嘗試回答我的考試任務離子請如果我說錯了什麼糾正我!

找不到合適的條件來確保小數點後面沒有有效的數字。例如:我們想知道的0.4 * 20這是8.000的結果,但由於不準確的問題,輸出會有所不同:

f=0.4; 
for(i=1;i<20;i++) 
    f=f+0.4; 
printf("The number f=0.4*20 is "); 
if(f!=8.0) {printf(" not ");} 
printf(" %f ",8.0); 
printf("The real answer is f=0.4*20= %f",f); 

我們的產量將是:

The number f=0.4*20 is not 8.000000 

The real answer is f=0.4*20= 8.000001 
+0

我不應該使用stdio.h以外的其他庫中的函數,我只用printf來顯示浮點數不精確。 – Dipok

+0

哦,對不起,謝謝你的注意! – Dipok