Форум «Всё о Паскале» _ Теоретические вопросы _ Sqrt Function
Автор: IBladeMasterI 4.10.2006 22:20
Напишем маленькую программку(Console App) var I,K: Ineteger; Begin I := 100000; K := round(sqrt( sqr(I) )); WriteLn('k=',K); ReadLn; End;
Как вы думаете что будет выведено?Максимальный размер Integer 2147483647 т.е 2*10^10 Будет выведено 37551. Мы думаем что это связано что когда в функцию sqrt поступает Integer там происходит переполнение. Если бы I было типа Real то все нормально.
Автор: volvo 4.10.2006 22:49
Цитата
Мы думаем что это связано что когда в функцию sqrt поступает Integer там происходит переполнение.
А ВЫ что хотели? Потеря разрядности, результат - неверный.
Двоичное представление 100000*100000 занимает 34 бита, размер Integer = 32 бита: 1001010100000010111110010000000000, то что показано красным - теряется.
ИспользуйТЕ более емкие типы:
var k, i64: int64; Begin i64 := 100000; K := round(sqrt( sqr(I64) )); WriteLn('k=',K); ReadLn; End.
Автор: IBladeMasterI 4.10.2006 23:21
100000= 10^5 10^5*10^5=10^10, Это <= 32 бит, т.к Integer 2*10^10 занимает 32 бита, но я думаю вы правы, т.к мы и сами так думали.
Автор: volvo 4.10.2006 23:23
Цитата
100000= 10^5
Это с каких пор? Вообще-то 10^6
Автор: IBladeMasterI 4.10.2006 23:23
Ха, при исполнение вашего кода выдает тотже результат! Скорее всего для Инт64 в sqrt тот же код что и для Integer....
Автор: volvo 4.10.2006 23:24
Как ВЫ думаете, прежде чем что-то отвечать, НЕУЖЕЛИ же я не проверил?
Скриншот дать? Или версию СВОЕГО компилятора ВЫ все-таки сообщите?
Автор: IBladeMasterI 4.10.2006 23:25
Цитата(IBladeMasterI @ 4.10.2006 19:21)
100000= 10^5 10^5*10^5=10^10, Это <= 32 бит, т.к Integer 2*10^10 занимает 32 бита, но я думаю вы правы, т.к мы и сами так думали.
Уважаемый, это 10^5 можете проверить где угодно, поэтому нет там переполнения
Автор: Гость 4.10.2006 23:26
Цитата(IBladeMasterI @ 4.10.2006 19:23)
Ха, при исполнение вашего кода выдает тотже результат! Скорее всего для Инт64 в sqrt тот же код что и для Integer....
А зачем тогда посоветовали использовать более емкие типы, если это не помагает?
Автор: Гость 4.10.2006 23:28
10^1=10 10^2=100 10^3=1000 10^4=10000 10^5=100000 Я просто хочу разобраться в этом вопросе
Автор: volvo 4.10.2006 23:30
Цитата
нет там переполнения
Запусти Windows Calculator, переведи 100000 в Binary и возведи в квадрат (при указании QWORD, разумеется), потом скопируй это в Notepad и ОЧЕНЬ ВНИМАТЕЛЬНО пересчитай биты, это понятно?
Придешь, когда закончишь подсчеты...
Автор: Гость 4.10.2006 23:32
Цитата(IBladeMasterI @ 4.10.2006 19:23)
Ха, при исполнение вашего кода выдает тотже результат! Скорее всего для Инт64 в sqrt тот же код что и для Integer....
Так у вас все ок? 1) Проверял на разных (на 2х) одна фигня 2) И все-таки в чем же там загвоздка?
Автор: volvo 4.10.2006 23:34
Цитата
А зачем тогда посоветовали использовать более емкие типы, если это не помагает?
Если это не помогает ТЕБЕ, это не значит, что у меня НЕ отработало:
Эскизы прикрепленных изображений
Автор: Гость 4.10.2006 23:40
Посчитал, да их там 34 - переполнение Скрин: так ты делал на паскале, а я console app т.е в Delphi 7. Вопрос: Как решить на Дельфи 7 не прибегая к Real ?
Автор: lapp 5.10.2006 9:46
Цитата(IBladeMasterI @ 4.10.2006 19:20)
Максимальный размер Integer 2147483647 т.е 2*10^10
Ошибка в подсчете количества знаков. 2 147 483 647 ~ 2*10^9
Цитата(volvo @ 4.10.2006 20:23)
100000= 10^5 Это с каких пор? Вообще-то 10^6
Хм, volvo, и ты в арифметике иной раз сбоишь..
Цитата(Гость @ 4.10.2006 20:40)
Скрин: так ты делал на паскале, а я console app т.е в Delphi 7. Вопрос: Как решить на Дельфи 7 не прибегая к Real ?
IBladeMasterI, а ты, оказывается, большой любитель вводить собеседников в заблуждение. Если уж ты постишь задачу по Дельфи в раздел по Паскалю - то, может, хотя бы сообщишь это? Кстати, volvo тебя спросил про компилятор в посте №6 - почему ты тогда проигнорировал вопрос, а теперь (в посте №13) указываешь на якобы неточность? Тебе наплевать на время тех, кто отвечает?
Автор: Гость 5.10.2006 11:14
Цитата(lapp @ 5.10.2006 5:46)
тебя спросил про компилятор в посте №6 - почему ты тогда проигнорировал вопрос, а теперь (в посте №13) указываешь на якобы неточность? Тебе наплевать на время тех, кто отвечает?
Ну меня спросили, нужен мне его компилятор, ладно отвечу - нет не надо, спасибо. Мне не наплевать,просто я думал что Object Pascal который входит в данный раздел похож на Дельфи... Вопрос закрыт,Всем спасибо.
Автор: lapp 5.10.2006 14:56
Цитата(Гость @ 5.10.2006 8:14)
Мне не наплевать,просто я думал что Object Pascal который входит в данный раздел похож на Дельфи...
Вот и хорошо Как видишь, казалось бы - мелочи (различия в компиляторах), а ответ на вопрос часто лежит именно в них. Зарегистрируйся и приходи еще для более точных и плодтворных разговоров Удачи!