2010-06-09 15 views
5

Bazı IronPython komut dosyalarını eklentiler olarak kullanan bir proje üzerinde çalışmak, C# kodlu işlevselliği kullanır. bu biraz AncakC#/IronPython Interop ve "float" veri türü

mc = MyClass() 
mc.ValueDictionary = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024}) 

: Böyle IronPython kodundan o özelliğin değerini, set

Dictionary<int, float> 

: benim C# sınıfları birinde, ben tipte bir özelliği vardır kod çalıştırılır nedeniyle, aşağıdaki istisna atar:

Microsoft.Scripting.ArgumentTypeException was unhandled by user code 
    Message=expected Dictionary[int, Single], got Dictionary[int, float] 

şeyler daha garip hale getirmek için, orijinal olarak C# kodu

kullanılan
Dictionary<int, double> 

Ancak IronPython'da "double" tipi bulamadım, bir kapriste "float" denedim ve hata yapmadan iyi çalıştı. Ama şimdi her iki ucunda (başlangıçta kullanıyor olmalıydı) şamandıralar kullanıyor ve C# kodunun "Tek" veri tipini kullandığını düşünüyor ?!

Hatta C# kütüphanesi ve malum olduğu üzere nesne tarayıcıda kontrol ettik, bu çok, gerçekten burada bir soru görmüyoruz "Single"

cevap

7

bir "yüzer" türünü kullanarak değil olarak gösteriyor her şey kendinize cevap verdi. Sanırım sen sadece şaşkınsın diye soruyorsun.

C# iki kayan nokta türü vardır: Yani yukarı net şeyler sağlayan float (kısaltmasıdır bir anahtar sözcük System.SingleMSDN, 32 bit uzunluğunda) ve double (System.DoubleMSDN için anahtar kelime, 64 bit uzunluğunda). diğer tarafta

Python python documentation devlet olarak, kayan nokta sayısı çift hassasiyet saklamak için float anahtar kelime/türünü kullanır:

Kayan nokta numaraları Tüm bahisler üzerinde C. çift kullanılarak uygulanmaktadır onların Çalıştığınız makineyi bilmediğiniz sürece hassasiyet kapalıdır.

Bunun için x86 mimarisinde 64 bit uzunluğundadır. Bu, IronPython'un bir float python'unu .NET System.Double olarak ele almasının sebebidir. sözü

, bu iki yöntem olacak hem iş:

C#:

Dictionary<int, float> single_precision_dict; 
Dictionary<int, double> double_precision_dict; 

IronPython:

single_precision_dict = Dictionary[int, Single]({1:0.0, 2:0.012, 3:0.024}) 
double_precision_dict = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024}) 
+0

Teşekkür ederim, mükemmel cevap. Ve evet, sanırım eşlemelerin ne olduğunu bir türlü anlattım, nedenini bilmiyordum. Sadece C# 'da yüzebilen kontrgerifçi Python'da yüzemezdi. –

+0

Hoş Geldiniz! Son zamanlarda benzer bir sorun yaşadım (C#/Python Interop). Onun gerçekten çok karşı sezgisel, tüm C gibi dilleri gibi, Java ve daha birçok kullanım tek hassas sayılar için float. –