Занимательная математика или когда возведение в квадрат дает минус.
от Microwap
Началось все с того что иногда при извлечении квадратного корня начала вылетать ошибка…
Честно говоря, я от этого впал небольшой ступор. Ведь ошибка возникала там, где ее быть в принципе не может. То есть, мне нужно было вычислить расстояние между двумя точками, если кто не в курсе вот формула:
Если короче, то ошибка возникнет, только если попытаться извлечь корень из отрицательного числа, что при данном раскладе невозможно (ну если кто в танке, возведение в квадрат, только положительные числа =)).
Собственно вот упрощенный код на дельфи (паскале), где и появлялась ошибка.
Стоит обратить внимание на то, что ошибка не появится, пока координаты точек не превысят определенное значение, то есть ошибка не явная, и отследить ее достаточно трудно.
Дальше пойдут эксперименты. И если кому то лень читать, или вы еще не догадались в чем дело, то знайте =)
Оказывается тупо переполнилась переменная типа integer… Вот так все просто.
Я на это потратил порядка двух часов, пока догадался, да такой я вот не умный =)
Так как, Дельфи (среда Delphi 7) упорно молчит о переполнении переменной, а только указывает, что извлечь корень из отрицательного числа невозможно, посмотрим как поведут себя другие языки программирования.
Все описанные ниже примеры, абстрактны и призваны показать, как можно допустить данную ошибку.
В C++ (среда Dev-C++) стоит только неправильно указать тип результата функции…
В С # (среда Microsoft Visual C# 2010 Express) по сути тоже самое
PHP (Среда «Notepad» =))
Не знаю, как в ПХП сделать такую ошибку, интерпретатор сам определяет типы переменных. Хотя было бы желание. Вот пример для наглядности.
Java Script – с ним все в норме, так как для чисел, там только один тип number
Остальные ЯП мне не очень нравятся, поэтому тут и остановимся. Все это это мои личные изъяснения, и если я не прав, буду рад если кто укажет в чем именно.
Честно говоря, я от этого впал небольшой ступор. Ведь ошибка возникала там, где ее быть в принципе не может. То есть, мне нужно было вычислить расстояние между двумя точками, если кто не в курсе вот формула:
Если короче, то ошибка возникнет, только если попытаться извлечь корень из отрицательного числа, что при данном раскладе невозможно (ну если кто в танке, возведение в квадрат, только положительные числа =)).
Собственно вот упрощенный код на дельфи (паскале), где и появлялась ошибка.
- var
- x1,y1,
- x2,y2:integer;
- dist:single;
- begin
- x1:=10;
- y1:=10;
- x2:=110;
- y2:=46350 + 1;
- dist:= Sqrt(sqr(x2 - x1) + sqr(y2 - y1));
- showmessage(floattostr(dist));
- end;
Стоит обратить внимание на то, что ошибка не появится, пока координаты точек не превысят определенное значение, то есть ошибка не явная, и отследить ее достаточно трудно.
Дальше пойдут эксперименты. И если кому то лень читать, или вы еще не догадались в чем дело, то знайте =)
Оказывается тупо переполнилась переменная типа integer… Вот так все просто.
Я на это потратил порядка двух часов, пока догадался, да такой я вот не умный =)
Так как, Дельфи (среда Delphi 7) упорно молчит о переполнении переменной, а только указывает, что извлечь корень из отрицательного числа невозможно, посмотрим как поведут себя другие языки программирования.
Все описанные ниже примеры, абстрактны и призваны показать, как можно допустить данную ошибку.
В C++ (среда Dev-C++) стоит только неправильно указать тип результата функции…
- int sqr (int arg) // возведение в квадрат
- {
- return pow(arg,2);
- }
- int main(int argc, char *argv[])
- {
- int x1 = 10,
- y1 = 10,
- x2 = 110,
- y2 = 46350 + 1;
- double dist;
- dist = sqrt(sqr(x1 - x2) + sqr (y1 - y2)); //Вычислить расстояние между точками
- printf("%f\n", dist);
- system("PAUSE");
- return EXIT_SUCCESS;
- }
В С # (среда Microsoft Visual C# 2010 Express) по сути тоже самое
- namespace ConsoleApplication1
- {
- class Program
- {
- static int sqr(int arg) // возведение в квадрат
- {
- return arg * arg;
- }
- static void Main(string[] args)
- {
- int x1 = 10,
- y1 = 10,
- x2 = 110,
- y2 = 46350 + 1;
- double dist;
- dist = Math.Sqrt(sqr(x1 - x2) + sqr(y1 - y2)); //Вычислить расстояние между точками
- Console.WriteLine(dist);
- Console.ReadKey();
- }
- }
- }
PHP (Среда «Notepad» =))
Не знаю, как в ПХП сделать такую ошибку, интерпретатор сам определяет типы переменных. Хотя было бы желание. Вот пример для наглядности.
- <?
- function sqr ($arg)
- {
- return (int) pow($arg,2);
- }
- $x1 = 10.01;
- $y1 = 10.4;
- $x2 = 110.0;
- $y2 = 46350.00 + 1.99;
- $dist = sqrt(sqr($x1 - $x2) + sqr ($y1 - $y2)); //Вычислить расстояние между точками
- echo $dist;
- ?>
Java Script – с ним все в норме, так как для чисел, там только один тип number
Остальные ЯП мне не очень нравятся, поэтому тут и остановимся. Все это это мои личные изъяснения, и если я не прав, буду рад если кто укажет в чем именно.