Страница 1 из 1

float == double, или занимательная математика

Добавлено: 22 июл 2006, 12:54
Oscar
Я, конечно, интуитивно догадывался, что сравнивать float с double не есть хорошо, но не подозревал, что всё так запущено :lol:

А посему спешу поделиться своим открытием :wink:

Код: Выделить всё

		int m = 100;
		
		for(int n = 5; n < 100; n += 5) {
			double d = n;
			d /= m;
			float f = n;
			f /= m;
			System.out.println("(" + d + " == " + f + ")\t=\t" + (d == f));
		}
		
		System.out.println();
		m = 128;
		
		for(int n = 5; n < 100; n += 5) {
			double d = n;
			d /= m;
			float f = n;
			f /= m;
			System.out.println("(" + d + " == " + f + ")\t=\t" + (d == f));
		}
результаты соответственно:

Код: Выделить всё

(0.05 == 0.05)      =        false
(0.1 == 0.1)        =        false
(0.15 == 0.15)      =        false
(0.2 == 0.2)        =        false
(0.25 == 0.25)      =        true
(0.3 == 0.3)        =        false
(0.35 == 0.35)      =        false
(0.4 == 0.4)        =        false
(0.45 == 0.45)      =        false
(0.5 == 0.5)        =        true
(0.55 == 0.55)      =        false
(0.6 == 0.6)        =        false
(0.65 == 0.65)      =        false
(0.7 == 0.7)        =        false
(0.75 == 0.75)      =        true
(0.8 == 0.8)        =        false
(0.85 == 0.85)      =        false
(0.9 == 0.9)        =        false
(0.95 == 0.95)      =        false
                
(0.0390625 == 0.0390625)        =        true
(0.078125 == 0.078125)          =        true
(0.1171875 == 0.1171875)        =        true
(0.15625 == 0.15625)            =        true
(0.1953125 == 0.1953125)        =        true
(0.234375 == 0.234375)          =        true
(0.2734375 == 0.2734375)        =        true
(0.3125 == 0.3125)              =        true
(0.3515625 == 0.3515625)        =        true
(0.390625 == 0.390625)          =        true
(0.4296875 == 0.4296875)        =        true
(0.46875 == 0.46875)            =        true
(0.5078125 == 0.5078125)        =        true
(0.546875 == 0.546875)          =        true
(0.5859375 == 0.5859375)        =        true
(0.625 == 0.625)                =        true
(0.6640625 == 0.6640625)        =        true
(0.703125 == 0.703125)          =        true
(0.7421875 == 0.7421875)        =        true

Второй случай понятен, поскольку делим на число, кратное двойке,
то и машинную точность получаем правильной.

Но вот первый случай ...
Оно ведь выводит ОДИНАКОВЫЕ числа!
И, кроме того, чем же так знаменательны 0.25, 0.5 и 0.75 ?..

Добавлено: 27 июл 2006, 18:21
Absurd
А числа с плавающей запятой сравнивать с помощью == вообще нельзя: результат такой операции неопределен. Надо так:

Код: Выделить всё

if (Math.abs(d - f) < OurConstants.OUR_PRECISION) {
 ...
}

Re: float == double, или занимательная математика

Добавлено: 10 дек 2006, 14:45
Oscar
вот опять наступил на те же грабли

[syntax="java"]float x = 1.035f;
double y = (double)x;
System.out.println(Math.round(x*100));
System.out.println(Math.round(y*100));[/syntax]
&quot писал(а):104
103
может кого-то спасёт от лишних синяков ..

Re: float == double, или занимательная математика

Добавлено: 11 дек 2006, 11:51
mobius
Oscar писал(а):вот опять наступил на те же грабли

[syntax="java"]float x = 1.035f;
double y = (double)x;
System.out.println(Math.round(x*100));
System.out.println(Math.round(y*100));[/syntax]



может кого-то спасёт от лишних синяков ..
Как-то давно мне на глаза попалась статйка в газете про проблемы float в С, суть заключалась в том, что при работе с дробной часть, в некоторых слючаях не хватало в конце 1.

Видимо проблема от туда.
Боюсь не вспомню, где это было, так как было давно...

Re: float == double, или занимательная математика

Добавлено: 11 дек 2006, 12:15
Oscar
mobius, оффтопик: оОо, уже, оказывается, в газетах о таком пишут :-D, от я тёмная душа, газет не читаю .... :-)

Re: float == double, или занимательная математика

Добавлено: 11 дек 2006, 18:19
mobius
Oscar писал(а):mobius, оффтопик: оОо, уже, оказывается, в газетах о таком пишут :-D, от я тёмная душа, газет не читаю .... :-)
В Минске в своё врема (лет 5-7 назад) про программинг одна газетка писала, ввиду отсталости развития нета.

Так что ничего по ходу смешного :)