2013-03-08 181 views
-2

我有一個應用程序,在該應用程序中我使用某個具有方法的類來返回當前流逝的時間給我。使用無符號long long而不是float來防止打包

unsigned long long getCurrentElapsedTime(){ 
} 

Unsigned long long代替float在上述類,因爲在一定時間(約1小時)後運行float渦卷(變更博覽會形式)。 早些時候,我使用的是從我的程序返回float秒(1.112,1.336等)的類中的方法。

float getElapsedTime(){ 
} 

我用上面的方法在我的程序如下:

float startTime, deltaTime; 
starttime = getElapsedTime(); 

On Some event 
deltaTime = getElapsedtime() - startTime; 
if(deltaTime > 1.0f){ 
//do something 
} 

我現在這個getCurrentElapsedTime()方法返回unsigned long long整數我未包裹,直到很長一段時間。 我必須在我的應用程序中以類似的方式在我的應用程序中使用此方法,但我很困惑我應該如何將unsigned long long轉換爲float,以便我不會獲取指數格式數字。 對於我的申請,我是較早使用float認爲有以下格式數字(1.123,2.345,3.737,等等)

如果我有一個很長的unsigned long long號,我嘗試轉換浮動,我可能會得到同樣的問題再次(和浮法將在博覽會的形式) 我如何解決這個問題?是否有類似的小數,我可以從unsigned long long轉換爲沒有進入包裝問題?

+0

指數形式不是使用'float's的問題,它只是'iostream'做出關於用戶希望看到什麼樣的格式的假設。 – 2013-03-08 08:30:15

+0

你爲什麼現在想回到花車?只要把所有的時間保持在長整數。 – 2013-03-08 08:31:01

+1

1 - 目前還不清楚你的'轉換'應該是什麼樣子。一個'unsigned long long'是一個整數,你爲什麼要把它轉換爲一個浮點數? 2 - 當打印浮動圖案時,您可以擺脫exp符號,但這會導致尾隨零點,從而產生不存在的精度印象。 3 - 無論如何,exp-notation有什麼問題? – us2012 2013-03-08 08:31:22

回答

0

浮動不會「改變」任何「博覽會」。實際上,unsigned long long會在某一點溢出,並且包回0. 0 float不會。如果您添加的增量太小,它將與以前的浮點值無關。浮動是有損的,但它可以表示諸如「無限」之類的值。長期無損,但有限。

這可能是你的輸出函數,它改變了一定比例的格式。但這是你如何打印你的號碼!

# Don't mind the python syntax, please: 
print "Different format strings: %.3f %e %f" % (1.0, 1.0, 1.0) 
Different format strings: 1.000 1.000000e+00 1.000000 

相同的號碼,不同的輸出

然而,你是什麼時間源?使用本機類型的時間源(可能會是long)僅通過將其轉換爲另一種類型,您無法提高精度。

+0

並不重要,但你是Python的過時:-)。在C++中,當然,'std :: cout << 1.0 << std :: fixed << 1.0 <<'<< << std :: scientific << 1.0 << std :: endl;''。 (你還應該提到'float'不會_wrap_,永遠不會''unsigned long long'。) – 2013-03-08 08:56:31

相關問題