SORU
19 Kasım 2010, Cuma


MATLAB'DA değişkenler GERÇEKTEN çift duyarlıklı varsayılan olarak?

Bu soru daha this question araştırdıktan sonra fark ettim ki garip bir şey ortaya çıkar...

Ben her zaman double-precision varsayılan olması için MATLAB değişkenleri anlaşıldı. Eğer virgülden sonra 20 basamaklı bir değişken bildirmek gibi bir şey yapacak olsam, yine de

>> num = 2.71828182845904553488;
>> class(num)  %# Display the variable type
ans =
double

Son 4 rakamı floating-point relative accuracy 10 sipariş üzerine olduğu için göz ardı olmanızı beklerdim-16:

>> eps(num)
ans =
    4.440892098500626e-016

Eğer virgülden sonra 16'dan fazla basamak sayısı (FPRINTF SPRINTF kullanarak) görüntülemek için çalışırsanız, görmek istiyorum ne olsun:

>> fprintf('%0.20f\n',num)
2.71828182845904550000
>> sprintf('%0.20f',num)
ans =
2.71828182845904550000

Diğer bir deyişle, rakamlar 17'den 20 0.

Ama işler Symbolic Toolbox bu sayı kesinlik 21 basamak kullanarak göstermek için söylüyorum variable precision arithmetic function num geçtiğimde biraz garip geldi:

>> vpa(num,21)
ans =
2.71828182845904553488

NE?!Bu son 4 rakamı tekrar ortaya çıktı! Onlar girdiğim orijinal sayı 12 ** çift hassas bir değişken olarak saklanır zaman kaybolmuş olması gerekmez mi? vpa num beri geçirildiğinde çift duyarlıklı değişken nasıl vpa ne olduklarını biliyor muydunuz?

Benim en iyi tahmin olarak ne oluyor MATLAB DAHİLİ olarak temsil eder num ile daha hassas daha bir çift beri başlatılmış bir sayı ile daha fazla rakam geçtiğimiz ondalık noktası daha bir çift duyarlıklı değişken başa çıkabilir. Bu gerçekten ne oluyor, ya da başka bir şey oluyor mu?



BONUS:Ve burada zaten yukarıda bir migren yok ama karışıklık ek bir kaynak

>> num = 2.71828182845904553488;  %# Declare with 20 digits past the decimal
>> num = 2.718281828459045531;    %# Re-declare with 18 digits past the decimal
>> vpa(num,21)
ans =
2.71828182845904553488  %# It's the original 20-digit number!!!

CEVAP
19 Kasım 2010, Cuma


Çiftler onlar. () Vpa sadece basit bir beşgen kullanmaktır nerede kayan nokta bağıl doğruluğu, ötesi olmayan anlamlı basamak görüntülemek için seçmektir() ve DEP() kesecek ya da onları dışarı sıfır.

Sen sadece ve sadece orijinal dört basamak geri çünkü gerçek seni seçti başlatmak sayı ile oluyor tam ondalık açılımı bir ikili double değer, çünkü kopyalama ve yapıştırılan çıktısı genişlemesi gerçek bir çift değer diğer bir soru. Senin "" Eki. BONUS olarak göstermek gibi diğer yakın değerler için hiçbir şey işe yaramaz

Daha doğrusu kapsamlı bir sayısal hazır bilgi türü Çift değerleri üretmek. Temsil ettikleri ondalık değere en yakın olan ikili çift değerine dönüştürülür. Sonuç olarak, çift türden hassas sınırı ötesinde bir edebi basamak sessizce bıraktı. Ne zaman kopyala yapıştır çıktı vpa için yeni bir değişken olarak diğer soru poster yaptı ile "e = ..." ifadesi, sen başlatma değeri değişmez, yerine ilgili doğrudan bir sonucu bir önceki ifade.

Farkları burada sadece çıkış biçimlendirme. Neler olduğunu vpa olduğunu düşünüyorum() çift çift duyarlıklı ikili alarak ve kesin bir değer olarak tedavi. Belirli bir ikili için mantis-üs değeri, ondalık keyfi birçok ondalık eşdeğer hesaplayabilirsiniz. Eğer sınırlı bir hassasiyet varsa (senin gibi"") genişliği sabit boyutlu veri herhangi bir tür ikili değer, sadece o kadar çok ondalık basamak önemli. () Sprintf ve bu programı varsayılan görüntü çıkışı kesilmesi veya 0 olarak önemli olmayan basamak göstererek bu işi. () Vpa hassas sınırları yok sayarak ve istediğiniz gibi birçok ondalık olarak hesaplamak için devam ediyor.

Bu ek basamak sahte, en yakın ondalık bir değer üretmek için diğer değerleri yerine onlar olsaydı, onlar her anlamda "" aynı ikili çift değer. yuvarlak içinde

İşte bunu göstermek için bir yol. X bu değerler iki katına saklanan her zaman aynıdır ve aynı vpa tarafından temsil edilecek bütün().

x = [
    2.7182818284590455348848081484902650117874145507812500
    2.7182818284590455348848081484902650117874145507819999
    2.7182818284590455348848
    2.71828182845904553488485555555555555555555555555555
    exp(1)
    ]
unique(x)

İşte bunu gösteren bir başka yolu. Burada birbirine çok yakın iki katına çıkar.

x0 = exp(1)
x1 = x0   eps(x0)

Vpa(x 0) ve vpa(x1) 16 basamak geçmişte çok farklı çıktılar üretmek gerekir. Ancak, aynı anda ikinci bir x değeri vpa(x) vpa(x 0) ve vpa(x1) arasında kalan ondalık gösterimi üreten bu tür oluşturmak mümkün değil.

(GÜNCELLEME: Amro fprintf('%bx\n', x) hex biçimde temel ikili değer tam bir temsilini görüntülemek için kullanabileceğiniz işaret ediyor. Bu aynı çift için hazır harita onaylamak için kullanabilirsiniz.)

Vpa şüpheleniyorum() tam değerler olarak girdiler davranır ve polymorphically çiftler daha hassas olan Sembolik Araç diğer Matlab türlerini destekler çünkü bu şekilde davranır. Bu değerler gerekecektir tarafından başlatılmış anlamı dışında sayısal rakamları, bu yüzden sym() alır ve bir dize olarak bir giriş ve "vpa(exp(1))" farklı "vpa(sym('exp(1)'))".

Mantıklı mı? Üzgünüm uzun windedness için.

(Test edemem yani Sembolik Araç yok not vpa() kendimi.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012
  • segtlim

    segtlim

    21 EKİM 2008
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010

İLGİLİ SORU / CEVAPLAR