簡體   English   中英

為什么浮點類型和 integer 類型在 C++ 中的處理方式不同

[英]Why are floating point types and integer types are treated differently in C++

最近我發現浮點類型和 integer 類型在 C++ 中的處理方式完全不同。

示例 1來自: 為什么浮點類型對於模板函數來說是無效的模板參數類型?

template <double x>
double func() {
  return x;
}

是無效的,而int是有效的。

示例 2來自: 如何初始化 C++ 中的私有 static 成員?

class foo
{
    private:
        static float const i = 42;
};

是無效的,而int是有效的。


在第一個鏈接的問題中,有一個 Versuch 的答案。 它指出像 float 和 double 這樣的類型在 C++ 中沒有定義的實現 但是,C++ 中的許多其他地方也是如此,特別是關於 integer 類型(1-補碼與 2-補碼)。

因此,是否有更深層次的原因導致浮點數和整數被區別對待?

根本問題是12始終具有不同的值,無論這些值如何表示。 3.1111111111153.111111111114在不同的系統上可能有也可能沒有不同的值,具體取決於值的表示方式,並且在同一系統上可能有不同的運行時值,具體取決於舍入模式的設置方式。 前者是編寫可移植代碼的基本問題:在一個系統上, x<3.111111111115>x<3.111111111114>可能是兩種不同的類型,而在另一個系統上可能是相同的類型。 后者對於類型系統來說不是問題,但會給用戶設置一個陷阱,因為對這些值的相等性測試可能會從其模板實例化的類型比較中產生不同的結果。

這種不確定性的一個實際后果是

void f(x<3.111111111115>) {} 
void f(x<3.111111111114>) {}

在一個平台上可能是合法的,但在另一個平台上是非法的。

暫無
暫無

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

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