2016-04-11 44 views
0

Örneğin, yukarı doğru yayınlar için otomatik kayan nokta (şablon) yer tutucu var mı? int türleri? Bir parametre alan ve otomatik upcast'leri dikkate alan uygun boyutta bir kayan nokta türü döndüren bir sınıf ya da ilgili bir şeyi kastediyorum.Kayan nokta tipine (upcast) cxx11 içinde entegre

Satırı beğenmedim, çünkü int durumunda, dönüşüm için doğru tür bir çift olur.

if (var_high - var_low <= std::numeric_limits<T>::epsilon()) 

Ayrıca değiştirmeniz gerekir: O tipi için en küçük gösterilebilen farkı (yüksek-düşük) karşılaştırabilirsiniz

template <class T> 
T linear_interpolate(const T &low_output, const T &high_output, 
        const T &var_value, 
        const T &var_low, const T &var_high) 
{ 
    if (var_value <= var_low) { 
     return low_output; 
    } 
    if (var_value >= var_high) { 
     return high_output; 
    } 
    // avoid zero divisions or zero like divisions 
    if(is_equal((float)var_high, (float)var_low)) { 
     return low_output; 
    } 

    T p = (var_value - var_low)/(var_high - var_low); 
    return low_output + p * (high_output - low_output); 
} 
+0

: Niye ya? – 101010

+0

@ 101010 Bir floatın yeterli hassasiyete sahip olmayacağı anlamına gelir (her ikisi için 32 bit düşünülerek). –

+0

Daha doğru bir anahtar kelime, fonksiyon veya sınıf otomatik olarak doğru tip (float, double, long double ..) ekliyor muydunuz – dgrat

cevap

0

: Bu örnekteki

if(is_equal((float)var_high, (float)var_low)) { 

int ile çalışmak için aritmetik - p geçici değişkeni, T bir tam sayı ise, her zaman sıfır olacaktır. Birkaç testlerle

Tam kod,: Size zaten farz gibi ben value<low vb testleri dahil değil

#include <limits> 

template <class T> 
T linear_interpolate(const T &low_output, const T &high_output, 
        const T &var_value, 
        const T &var_low, const T &var_high) 
{ 
    if (var_value <= var_low) { 
     return low_output; 
    } 
    if (var_value >= var_high) { 
     return high_output; 
    } 
    // avoid zero divisions or zero like divisions 
    if (var_high - var_low <= std::numeric_limits<T>::epsilon()) { 
     return low_output; 
    } 

    return low_output 
     + (var_value - var_low) * (high_output - low_output)/(var_high - var_low); 
} 


#include <iostream> 
int main() 
{ 
    std::cout << linear_interpolate(1, 10, 6, 0, 9) << std::endl; 
    std::cout << linear_interpolate(1, 10, 0, 0, 0) << std::endl; 
    std::cout << linear_interpolate(1, 10, 1, 0, 1) << std::endl; 

    std::cout << linear_interpolate(1.0, 10.0, 6.0, 0.0, 9.0) << std::endl; 
    std::cout << linear_interpolate(1.0, 10.0, 0.0, 0.0, 0.0) << std::endl; 
    std::cout << linear_interpolate(1.0, 10.0, 1.0, 0.0, 1.0) << std::endl; 
} 

olanlar var.


Muhtemelen doğrusal enterpolasyon giriş ve çıkış için farklı türde isteme ihtimali olduğunu dikkate almak gerektiğini:

"dönüşüm için doğru tip bir çift olacağını int durumunda"
template <class T, class S=T> 
S linear_interpolate(const S &low_output, const S &high_output, 
        const T &var_value, 
        const T &var_low, const T &var_high) 
+0

Eğer kullanıcı tamsayılar eklerse, sabit bir tam sayıyı epsilon (kayan nokta) ile karşılaştırırdınız. Bu bir up-cast ile sonuçlanabilir. – dgrat

+0

@dgrat, true - 'std :: numeric_limits :: epsilon()' bir 'T' döndürür, bu nedenle hiçbir zaman bir dönüştürme işlemi gerçekleştirilemez. –

İlgili konular