Обнаружил этот гений map Функция в библиотеке Arduino. Написал же я Delphi:Delphi - Функция отображения неожиданного вывода
procedure TForm1.Button1Click(Sender: TObject);
function map(x, in_min, in_max, out_min, out_max: Integer): extended;
begin
result := (x - in_min) * (out_max - out_min)/(in_max - in_min) + out_min;
end;
var
y, in_min, in_max, out_min, out_max: Integer;
i: integer;
m: extended;
begin
in_min := 0;
in_max := 6406963;
out_min := 0;
out_max := 474;
y := 0;
for i := in_min to in_max do begin
m := map(i, in_min, in_max, out_min, out_max);
if round(m) <> y then begin
y := round(m);
Memo1.Lines.Add(IntToStr(i) + ' = ' + FloatToStr(m));
end;
end;
end;
Есть некоторые забавные результаты от него, так что я написал то же самое в Python, чтобы проверить и подтвердить с:
def map(x, in_min, in_max, out_min, out_max):
"Re-maps a number from one range to another."
return (x - in_min) * (out_max - out_min)/(in_max - in_min) + out_min
if __name__ == '__main__':
in_min = 0
in_max = 6406963
out_min = 0
out_max = 474
y = 0
for i in range(in_min, in_max):
m = map(i, in_min, in_max, out_min, out_max)
if round(m) != y:
y = round(m)
print(i, ' = ', m)
Вот отрывок из моих результатов:
DELPI EXPECTED (Python)
6759 = 0,500044404813 6759 = 0.50004440481395
1358439 = 100,500047526418 1358439 = 100.50004752641775
2710119 = 200,500050648022 2710119 = 200.50005064802153
4061799 = 300,500053769625 4061799 = 300.5000537696253
4521370 = 334,500040034569 4521370 = 334.50004003456866
4530557 = -335,179597260043 4534887 = 335.50005486218663
5418335 = -269,499996488196 5413479 = 400.5000568912291
6405062 = -196,499949820219 6400205 = 473.50002957719596
Итак, почему мой код Delphi производит отрицательные числа в качестве вывода и что нужно сделать, чтобы исправить это?
4530557 * 474 = -2147483278 в 32-битной арифметики (переполнение), отсюда минус. Delphi использует 32-битные целые числа, произвольные целые числа точности Python AFAIK. – kludg