Ben görmek istiyorum bir şey olduğunu bir tanıma olacağını double
üzere float
iken, genişleyen dönüşüm olarak kabul edilmelidir float
için double
(*) daraltıyor. Bu sezgisel görünebilir gibi görünebilir, ancak türlerin gerçekte ne anlama geldiğini düşünün:
- 0.1f "13,421,773.5 / 134,217,728, artı veya eksi 1 / 268,435,456 ya da öylesine" anlamına gelir.
- 0,1 gerçekten 3,602,879,701,896,397 / 36,028,797,018,963,968, artı veya eksi 1 / 72,057,594,037,927,936 veya daha fazla anlamına gelir.
Eğer biri double
"onda biri" miktarının en iyi temsilini elinde tutarsa ve onu dönüştürürse float
, sonuç "13,421,773.5 / 134,217,728, artı veya eksi 1 / 268,435,456 ya da öylesine" olacaktır, ki bu değerin doğru bir açıklamasıdır.
Buna karşılık, float
"onda biri" miktarının en iyi temsilini elinde tutan ve bunu dönüştüren double
sonuç varsa, sonuç "13,421,773,5 / 134,217,728, artı veya eksi 1 / 72,057,594,037,927,936 veya benzeri" - zımni doğruluk düzeyi olacaktır. 53 milyonun üzerinde bir faktör tarafından yanlış.
IEEE-744 standardı kayan nokta matematik yapılması gerektiği halde sanki her kayan noktalı sayı kayan nokta değerleri aslında tam olarak o temsil ettiğini ima etmek alınmamalıdır onun aralığın ortasında tam kesin sayısal miktarını temsil sayısal büyüklükler. Aksine, değerlerin aralıklarının merkezinde olduğu varsayılması gerekliliği üç olguya dayanır: (1) hesaplamalar, işlenenler belirli belirli kesin değerlere sahipmiş gibi yapılmalıdır; (2) tutarlı ve belgelenmiş varsayımlar tutarsız veya belgesiz olanlardan daha yararlıdır; (3) eğer biri tutarlı bir varsayımda bulunacaksa, bir niceliğin menzilinin merkezini temsil ettiğini varsaymaktan daha iyi başka hiçbir tutarlı varsayım kabul edilemez.
Bu arada, yaklaşık 25 yıl önce hatırlıyorum, birisi her biri bir çift 128-bitlik yüzerden oluşan "aralık türlerini" kullanan C için sayısal bir paket buldu; Tüm hesaplamalar, her sonuç için mümkün olan minimum ve maksimum değerleri hesaplayacak şekilde yapılacaktır. Eğer biri büyük, uzun bir yinelemeli hesaplama yaptıysa ve [12.53401391134 12.53902812673] değerine sahipse, birçok hassas basamağın yuvarlama hatalarından kaybedilmesine rağmen sonucun makul ölçüde 12.54 olarak ifade edilebileceğinden emin olabilir (ve bu değer y ... t gerçekten 12.9 veya 53.2). Ana akım dillerde bu tür bir destek görmedim, özellikle de paralel olarak birden fazla değerde çalışabilecek matematik birimlerine çok yakışırlar, çünkü şaşırdım.
(*) Pratikte, tek duyarlıklı sayılarla çalışırken ara hesaplamaları tutmak için çift duyarlıklı değerlerin kullanılması yararlı olur; bu nedenle, tüm bu işlemler için bir yazım denetimi kullanmak can sıkıcı olabilir. Diller, çift olarak hesaplamaları yapabilen ve serbestçe bekarlara tek tek basmak için kullanılabilecek "bulanık çift" türüne sahip olarak yardımcı olabilir; bu özellikle tip double
ve dönüş parametrelerini alan fonksiyonların double
işaretlenebilmesi için faydalı olacaktır, böylece otomatik olarak "bulanık çift" i kabul eden ve döndüren bir aşırı yük oluşturacaklardı.