Wątek przeniesiony 2016-10-06 20:57 z Java przez bogdans.

porównywanie liczb float

0

nie wiem czemu dany kod nie działa dla int było wszystko ok (powinno wyrzucić 0)

 
import java.util.*;
public class Glowna {

	public static void main(String[] args) {
		double x ;
		for(x=-10.0;x<=10.0;)
		{
			if(Math.abs(x-1.0) == Math.abs(x+1.0)) System.out.println(x+);
			x=x+0.1;
		}
	}

}

 
2

Działania arytmetyczne (zwłaszcza dodawanie i odejmowanie) na liczbach zmiennoprzecinkowych mają ograniczoną dokładność.

Najprawdopodobniej w tym miejscu

Math.abs(x-1.0) == Math.abs(x+1.0)

równość nigdy nie zachodzi.

Robi się to przez odjęcie i porównanie do bardzo małej liczby.

double delta = Math.abs(x+1.0) - Math.abs(x-1.0);
if (Math.abs(delta) < 0.00001) ...
0

Zaskakujące efekty porównywania liczb zmiennoprzecinkowych można uzyskać dużo prościej.

System.out.println(0.1 + 0.1 + 0.1 == 0.3); //false
0

Liczby zmiennoprzecinkowe mają wartości przybliżone, a operacje na nich powodują, że powstaje dodatkowy błąd przybliżeń: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1