2015-05-04 26 views
11

Double -> Float gitmek için deyiminiz nedir?Çevreye giriş yap Çift -> Float in Haskell

uncurry encodeFloat . decodeFloat mı?

(I gloss kullanıyorum, bu Şamandıralar gerektirir) Ve böyle sorulara cevap bulmak için önerilen yolu nedir?

Ben this hoogle query çalışıyordum ama cevaplar her (denemek - bu listenin en başında unsafeCoerce vardır) çok yararsızdır

+2

Bu acı verici bir dönüşüm olacak. – Shoe

+0

@Jefffrey: Böyle bir dönüşümün acı verici olacağını mı yoksa belirli bir uygulamanın mı olduğunu söylüyorsunuz? – d8d0d65b3f7cf42

+0

Emin değilim, çünkü "Float" ın Haskell'de "özel" olduğunu hatırlıyorum ve buranın vebadan kaçınmak için söylendiğini hatırlıyorum, ama genelde "çift" çift kesinlikli kayan nokta sayısı anlamına geliyor ve genellikle 64 bit "float" ise genellikle 32 bit olan tek bir kayan noktalı sayıdır. Durum böyle ise bir kayıp dönüşümü olduğunu açıkça görebilirsiniz. – Shoe

cevap

14

kullanın realToFrac :: (Real a, Fractional b) => a -> b.

herhangi fraksiyonel türü (gibi Float, Double veya Rational) için bir reel sayı türü (gibi Int, Float veya Double) dönüştürür. Bu fonksiyon (fromRational . toRational) genel tanımı Float ve Double arasındaki dönüşümler için daha etkili uygulamalar kullanmak Rational tipi there are rewrite rules ile yavaş dönüşüm yapsa bile

not edin.

+0

Bu standart yoldur. Dikkat edilmelidir ki, doğrudan uygulama oldukça verimsizdir, çünkü “Rasyonel” bir aracı olarak kullanmaktadır. Bu kesinlikle uzaklaştırabilir, ancak GHC'nin bunu ne kadar güvenilir yaptığını bilmiyorum - kodda 'ÖZELLEŞTİRME' seçeneğini bulamadı. – leftaroundabout

+5

Ayrıca: https://ghc.haskell.org/trac/ghc/ticket/3676 – d8d0d65b3f7cf42

+1

@leftaroundabout: [bunları Bulunan] (https://hackage.haskell.org/package/base-4.8.0.0/docs/src /GHC-Float.html#line-1082). Yeniden yazım kuralları olarak uygulanmaktadırlar, bu durumda 'float2Double # 'ilkelinin etrafındaki sarıcı olan' GHC.Float.float2Double '. – hammar