2016-03-28 46 views
3

我很好奇,後面爲什麼std::ratio僅暴露出numden值,而不是一些value構件推理這將代表可能的形式爲什麼std :: ratio沒有值成員?

static constexpr double value = num/den;

我的比率的合理值,想象它可能是因爲

  • 他們可能沒有想在雙鎖定(或任何一個特定的)精密
  • 的operati在是微不足道的用戶代碼來執行
  • 這可能需要一個討厭的(不安全?)投

但我如果是缺乏標準的單一值成員其他充分的理由感到好奇?

ASSIDE:

有一個實際應用中這對我來說,因爲我希望實現的std::ratiostrongly-typed unit library更強類型的版本,我一直在努力,對此我認爲像下面這樣纔有意義(假設我絕不錯過一些瞭解有關std::ratio和常量性)

template<typename UnitType, std::intmax_t Num, std::intmax_t Denom = 1> 
struct unit_ratio : private std::ratio<Num, Denom> 
{ 
    static const UnitType value() { return UnitType((double)num/den); 
}; 

在這種情況下,顯然在用戶代碼執行num/den是不一樣的東西被退回一個UnitType其中包含值num/den,但我有點擔心,這是一個壞主意,因爲std::ratio不會做類似的事情。

+0

是不是因爲浮點數實際上可能不代表日糧? – NathanOliver

+0

@NathanOliver在我看來,它將代表它和'double val =(double)myRatio :: num/myRatio :: den',這是大多數人在代碼中使用它的原因。我通常使用'ratio'來解決模板不能帶非整型非類型成員的事實。 –

+5

double不是一個* rational *值,它是* real *值的近似值。有理數是整數編號的比率。 – Galik

回答

5

也許是因爲沒有浮點也不雙,可以是恰好等於一樣簡單1/31/5的比率。只有通過使用整數係數的線性組合的1/2 n具有精確的浮點表示。

你必須記住std::ratio理性的數字,也就是num/den形式的數字,其中num和den都是整數值。

所以恕我直言,你可以定義一個float_approx如果你喜歡,但不要把它的值,除非你真的要面對醜陋的情況下,兩個不同的比例將仍然共享相同

+0

「面值組合」應該被替換爲「總和」(並且只有一些這樣的總和)。 – Yakk

+0

我認爲這裏的一致意見是我濫用比率一點點,你說得對,問題的癥結似乎是我需要更多的語義正確的結構名稱。 –

+0

@NicolasHolthaus真的,有很少的單位(有沒有*在今天的世界?),他們之間沒有一個合理的比例。即使你沒有使用「比率」,單位翻倍也是一個糟糕的計劃。 – Yakk

相關問題