2015-06-11 96 views
0

我在spoj http://www.spoj.com/problems/ATOMS/上解決了這個問題。我必須給出log(m/n)/ log(k)的整數部分作爲輸出。我已經把m,n,k當作很久了。當我用長雙打計算時,我得到了一個錯誤的答案,但是當我使用float時,它就被接受了。有時浮動好於浮動嗎?

printf("%lld\n", (long long)(log(m/(long double)n)/log(k))); 

這是給一個錯誤的答案,但這樣的:

printf("%lld\n", (long long)((float)log(m/(float)n)/(float)log(k))); 

被錄取了。那麼在精度方面浮點數比雙精度好的情況下呢?

+5

這並不是說'float'比'double'更好。將浮點數轉換爲整數時,應考慮舍入誤差。這並不像扔掉它那麼簡單。 –

+0

如何安全地將浮點數轉換爲整數? @順磁牛角麪包 – In78

回答

2

float從未更準確的比,因爲前者一個double必須是後者的子集,由C標準:

6.2.5/6道:「組類型浮子的值的是double類型的值集合的子集; double類型的值集合是long double類型的值集合的子集。

請注意,標準確實而不是堅持特定的浮點表示,儘管IEEE754特別常見。

1

double總是會給你比float更高的精度。 使用double時,您使用64位對數字進行編碼,而僅使用浮點數的32位。

編輯:正如延斯提到它可能並非如此。只有當編譯器使用IEEE-754時,double纔會提供更高的精度。 GCC,Clang和MSVC就是這種情況。我還沒有遇到一個編譯器,它不使用32位浮點數和64位雙精度浮點數...

+4

這是錯誤的。雙精度浮點數和浮點數可以使用相同的位數(即無法區分),它們不需要是32的倍數。不要從您熟悉的一種實現中推斷出:-) – Jens

+0

這是真的。只有編譯器符合IEEE-754的情況。我從來沒有遇到過沒有通過的編譯器。 – Jouan

1

在某些情況下,在計算時間/空間性能方面可能會更好。一個例子就在我面前 - 一個基於ARM Cortex-M4F的微控制器,具有硬件浮點單元(FPU),能夠處理單精度算法,但不能處理雙精度,難以置信的提升浮點計算。

1

試試這個簡單的代碼:

#include<stdio.h> 
int main(void) 
{ 
    float i=3.3; 
    if(i==3.3) 
     printf("Equal\n"); 
    else 
     printf("Not Equal\n"); 
    return 0; 
} 

現在雙儘量相同,因爲我的數據類型。

+0

充分尊重...代碼運行良好,無需編輯。 – SoumyadeepB

+1

「works」!=「correct」 –

+0

「效果很好」==「正確」 – SoumyadeepB