簡體   English   中英

C ++標准是否在浮點數表示中指定了任何內容?

[英]Does the C++ standard specify anything on the representation of floating point numbers?

對於類型T針對std::is_floating_point<T>::valuetrue ,不C ++標准指定的道路上任何T應當執行?

例如, T是否必須遵循符號/尾數/指數表示? 還是可以完全武斷?

從N3337:

[basic.fundamental/8]:共有三種浮點類型:float,double和long double。 double類型至少提供與float一樣高的精度,long long類型提供至少與double一樣高的精度。 float類型的值集是double類型的值集的子集; double類型的值集是long double類型的值集的子集。 浮點類型的值表示形式是實現定義的 整數和浮點類型統稱為算術類型。 標准模板std :: numeric_limits(18.3)的專業化應為實現指定每種算術類型的最大值和最小值。

如果要檢查實現是否使用IEEE-754,則可以使用std::numeric_limits::is_iec559

static_assert(std::numeric_limits<double>::is_iec559,
              "This code requires IEEE-754 doubles");

有許多在這一領域的其他輔助性的特征,如has_infinityquiet_NaN更多

C標准具有一個“附件”(在C11中為附件F),列出了實現C符合IEEE 754的后繼標准IEC 60559的含義。符合附件F的實現必須具有IEEE -表示浮點數。 但是,實施本附件是可選的; 核心標准特別避免說任何有關浮點數表示的事情。

我不知道是否有C ++的等效附件。 它沒有出現在N3337中,但這可能意味着它是單獨分發的。 std::numeric_limits<floating-type>::is_iec559存在表明C ++委員會至少對此std::numeric_limits<floating-type>::is_iec559 考慮 ,但可能不像C委員會那樣詳細。 (一直以來,總是很遺憾,C ++標准未表示為對C標准的一組編輯。)

不需要特定的實現。 C ++標准根本不討論它。 C標准非常詳細地介紹了為浮點數假設的概念模型,並在一些底數b帶有符號,指數,有效位數,依此類推。 但是,它特別指出,這僅是描述性的,而不是對實現的要求(C11,腳注21):

浮點模型旨在澄清每個浮點特性的描述,並且不需要實現的浮點算法相同。

這就是說,雖然細節可以改變,至少它隨便在我看來,生產(例如)的一致性實現double未與通常的模式(即有效數字和指數)配合相當密切的將是困難的(或至少很難與競爭績效掛鈎)。 但是,以其他方式改變它並不是特別困難,例如重新排列順序或使用不同的基數。

std::numeric_limits<T>::digits (和std::numeric_limits<T>::digits10 )的定義直接暗示着,浮點類型列出的所有數字必須(至少近似)保持相同的精度。在相當大的范圍內。 到目前為止,最明顯的實現方法是將一定數量的位/位數分配給一個有效位數,而將其他一些(單獨的)位分配給一個指數。

std::is_floating_point的想法是使不同來源的用戶代碼更好地協同工作。 從技術上講,您可以將int指定為std::is_floating_point而不會引起未定義的行為。 但是說您有一些模板庫,必須重復除以T n 為了加快處理速度,庫創建了一個T ni = 1 / n並用乘以ni替換除n 這對浮點數很有用,但對整數則無效。 因此,該庫僅在std::is_floating_point<T>::value == true時才正確執行優化。 如果您撒謊,那么從標准的角度來看,該代碼可能仍然可以使用,但是從邏輯的角度來看,這是不正確的。 因此,如果編寫的類的行為類似於較大的float則將其標記為std::is_floating_point ,否則不要這樣做。 這應該為您提供最佳代碼和正確代碼。

暫無
暫無

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

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