簡體   English   中英

我應該如何獲得浮點值的小數部分?

[英]How should I obtain the fractional part of a floating-point value?

我有一個float類型的變量x ,我需要它的小數部分。 我知道我可以得到它

  • x - floorf(x) ,或
  • fmodf(x, 1.0f)

我的問題:其中一個總是比另一個更可取嗎? 它們實際上是一樣的嗎? 我可以考慮第三種選擇嗎?

筆記:

  • 如果答案取決於我使用的處理器,讓我們將其設為 x86_64,如果您可以詳細說明其他處理器,那會很好。
  • 請確保並參考x負值的行為。 我不介意這種或那種行為,但我需要知道這種行為是什么。

我可以考慮第三種選擇嗎?

它有專用的 function。 modff的存在是將數字分解為整數和小數部分。

float modff( float arg, float* iptr );

將給定的浮點值arg分解為整數和小數部分,每個部分具有與arg相同的類型和符號。 整數部分(浮點格式)存儲在iptr指向的 object 中。

我會說x - floorf(x)非常好(精確),除了在極端情況下

  • 它對於負零或任何其他負整數浮點有錯誤的符號位(我們可能期望小數部分具有相同的符號位)。
  • 它不適用於 inf

modff 確實尊重 int 和 frac 部分的 -0.0 符號位,並為 +/-inf 小數部分回答 +/-0.0 - 至少如果實現支持 IEC 60559 標准 (IEEE 754)。
inf 的基本原理可能是:由於每個大於 2^precision 的浮點數都有一個 null 小數部分,因此對於無限浮點數也必須如此。

這是次要的,但仍然不同。

編輯錯誤,當然正如@StoryTeller-UnslanderMonica 所指出的那樣, x - floor(x)最明顯的缺陷是針對帶有小數部分的負浮點的情況,因為應用於-2.25,例如它將返回+0.75,這不是我們所期望的......

由於使用了 c99 label, x - truncf(x)會更正確,但仍然會遇到我最初關注的小問題。

暫無
暫無

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

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