Dziwne zaokrąglanie, gdy nie powinno go być

0

Napotkałem na dziwny problem, który nie daje mi spokoju już od paru godzin - chodzi o dziwne zaokrąglanie gdy nie powinno ono mieć miejsca. Dla zmiennych

i := 0;
sX := 2147483615;
Resolution := 128;

następujące polecenie

qx0 := Trunc((i + sX) / Resolution);

powinno do qx0 wpisać 16777215, ale wpisuje 16777216 (dowód w załączniku). Próbowałem (i + sX) / Resolution przypisać do jakiegoś singla lub doubla, jednak tam też od razu trafiała wartość 16777216 bez żadnych ułamków (poprawny wynik 2147483615 / 128 to 16777215,7421875).

qx0, sX, i to Cardinal, Resolution to Integer. Pracuje na Turbo Delphi.

Najdziwniejsze jest to, że w innym projekcie działa jak należy. Co może być nie tak?

0
  1. A wiesz co robi funkcja Trunc() ?
  2. Jak ty sobie widzisz zapisywanie ułamku do zmiennej typu Cardinal ?
0
_13th_Dragon napisał(a)

A wiesz co robi funkcja Trunc() ?

A co ma robić? Obcina część ułamkową, a nie zaokrągla. Czyli dla 16777215,7421875 powinna odrzucić ,7421875 i do zmiennej wpisać 16777215, a tak się nie dzieje - bo do trunca przekazywane jest 16777216 i nie ma co obcinać i nie wiem dlaczego.

Tak patrzę to źle posta napisałem, zaraz poprawię.

0

Napisz tak:
qx0 := (i + sX) div (Resolution);
i po sprawie.

0
_13th_Dragon napisał(a)

Napisz tak:
qx0 := (i + sX) div (Resolution);
i po sprawie.

Gdybym mi zależało tylko na części całkowitej to by było po sprawie, ale dalej potrzebuję tej wartości ułamkowej. Kolejna linijka (zasłonięta czerwonym paskiem na załączniku) to:

tx0 := ((i + sX) / Resolution) - qx0;

Tutaj tx0 to zmienna typu single, do niej powinien trafić ten ułamek. Jednak (i + sX) / Resolution zwraca od razu wartość zaokrągloną, przez co ułamek się gubi.

Podkreślam, że kod ten w innym projekcie działa bez zarzutu.

0

tx0 := Frac(Single(i + sX)/Single(Resolution));
to powinno zadziałać.

0
_13th_Dragon napisał(a)

tx0 := Frac(Single(i + sX)/Single(Resolution));
to powinno zadziałać.

2x invalid typecast.

0

No tak Turbo Delphi...
Frac((0.0+i + sX)/(0.0+Resolution));

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