LINUX.ORG.RU

Странные значения в математической функции

 


0

3

Есть функция:

Point pshift(Point pt1, Point pt2, uint32_t value)
{
    float D = distance((Rect){pt1, pt2});
    if (D == 0) return pt1;
    Point result;
    result.x = pt1.x + (value * (pt2.x - pt1.x)) / D;
    result.y = pt1.y + (value * (pt2.y - pt1.y)) / D;
    return result;
}
Point - struct с двумя int32_t, Rect - два Point.

Приходят на вход значения:

p1 = (186, 92)
p2 = (362, 27)
value = 50
На выходе по иксу все ок, по игреку - ересь: 22892002.

Почему?

Царя можете не вносить, все и так знают, что все, включая K&R не знают си.

★★

Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от carb_blog10

Тут дело не в делении, а в касте во флоат.

В коде naszar-а нет каста во флоат.

Умножению/делению пофиг на знаки и даёт оно абсолютно одинаковый результат.

Да что ты говоришь. Начни тогда с основ: процессорные операции div и idiv.

Знаковая арифметика:

4 / -1 = частное -4 и 0 в остатке:

0x00000004 / 0xFFFFFFFF -> частное 0xFFFFFFFC, остаток 0x00000000.

Беззнаковая арифметика:

4 / MAX_UINT = частное 0 и 4 в остатке.

0x00000004 / 0xFFFFFFFF -> частное 0x00000000, остаток 0x00000004.

В первом случае 0x00000004 делится на 0xFFFFFFFF при помощи idiv. А во втором случае — при помощи div.

anonymous
()
Ответ на: комментарий от carb_blog10

carb_blog10

Ого, уже 10й! Что будешь делать, когда дойдешь до максимально допустимой длины никнейма? И почему не carb_bloga вместо carb_blog10?

sambist ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.