2016-03-28 20 views
3

muhtemelen formaNeden std :: oranı bir değer üyesine sahip değil?

static constexpr double value = num/den;

ben, oranının rasyonel değerini temsil edecek std::ratio sadece num ve den değerleri ve bazı value üyesini açığa neden arkasında muhakemesine merak ediyorum

  • Onlar çift kilitlemek istedi (veya herhangi bir belirli) hassas
  • Operati olmayabilirdi, çünkü bu olabilir hayal üzerinde Kötü bir gerektirebilir
  • kullanıcı kodu gerçekleştirmek için önemsiz (güvensiz?)

döküm ama standardında bir tek değer üyesi olmaması için diğer iyi nedenler varsa merak ediyorum?

ASSIDE: sanırım kendisi için ben üzerinde çalıştığım bir strongly-typed unit library için std::ratio daha güçlü yazılmış versiyonları, uygulamak için arıyorum çünkü benim için pratik bir uygulama var,

aşağıdaki gibi bir şey iade edilen aynı şey değildir açıkçası, bu durumda

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); 
}; 

(I std::ratio ve const-lık hakkında bazı anlayış kaçıramam varsayarak) kullanıcı kodu num/den gerçekleştiren mantıklıdır num/den değerini içeren bir UnitType, ama std::ratio benzer bir şey yapmaz beri ben bu biraz kötü bir fikir.

+0

Kayan nokta sayısı aslında rasyonu temsil etmeyebilir değil mi? – NathanOliver

+0

@NathanOliver bana öyle görünüyor ki, bu çiftin de temsil ettiği gibi, çifte val = (çifte) myRatio :: num/myRatio :: den' ki çoğu insanın kendi kodlarında ne yapacağıdır. Şablonların, non-integral olmayan tip olmayan üyeleri alabileceği gerçeğini ortadan kaldırmak için genellikle 'ratio' kullanırım. –

+5

Bir çifte gerçekte bir * rasyonel * değeri değil, bir * gerçek * değerinin bir yakınlaştırmasıdır. Rasyonel sayılar tam sayılı oranlardır. – Galik

cevap

5

olabilir hiçbir kayan nokta ne de çift var Belki de tam1/3 veya 1/5 bir basit bir orana eşit. Sadece tamsayı katsayıları kullanılarak 1/2 n doğrusal kombinasyonlarının elde ettiği oran tam olarak IEE754 kayan nokta temsilciliğine sahiptir. Sen std::ratiorasyonel sayılar için olduğunu unutmamalıyız

, o num ve den hem ayrılmaz değerlerdir formu num/den sayılardır.

Yani IMHO isterseniz siz bir float_approx tanımlayabilir, ama sen gerçekten iki farklı oranlar hala aynı değerini paylaşır çirkin vakaları yüz istemedikçe değer demiyoruz.

+0

"par kombinasyonları", "toplamlar" ile değiştirilmelidir (ve sadece bu tür toplamlar). – Yakk

+0

Bence buradaki fikir birliği, biraz kötüye kullanıyorum ve problemin özü, yapı için daha çok semantik olarak doğru bir isme ihtiyacım var gibi görünüyor. –

+0

@NicolasHolthaus Gerçekten, aralarında rasyonel bir oranın olmadığı çok az birim var (günümüz dünyasında * var mı?)? 'Ratio' kullanmıyor olsanız bile birimler için iki katına çıkmak kötü bir plandır. – Yakk

İlgili konular