Форум » [x]Harbour » Волшебные числа и операции » Ответить

Волшебные числа и операции

AndreyZh: Доброе утро! Вот наткнулся на очередную ошибку xHarbour и Clipper. Думал, что глюк ОС или ПК, но нет. Пример ошибки - оператор "остаток от деления": 8.8 * 3 = 26.4 или 3.3 * 3 = 9.9, но операции (%) дают 26.4%8.8 = 8.8 или (НО правильно) 9.9%3.3 = 0 Вопрос - как Вы обходите данные глюки? Или где в "арифметике" ожидать очередных "засад"? До кучи напомню об ошибочной работе функции Int в Clipper (в xHarbour кажется работает правильно)

Ответов - 150, стр: 1 2 3 4 5 6 7 8 All

Dima: AndreyZh Держи http://files.mail.ru/RSTCM6

AndreyZh: Dima пишет: Держи http://files.mail.ru/RSTCM6 Спасибо - скачал

AlexMyr: AndreyZh пишет: А Вы уважаемый! - не передёргивайте... Например Lazarus, впрочем и другие популярные системы разработок (PHP, C++, ...) имеет большой набор литературы, да если поискать на сайтах разработчиков библиотек Harbour то же многое можно накопать! Спокойно! Вот видите Вы уже многое и накопали! Так что там про старт Вас интересует?


AndreyZh: AlexMyr пишет: Так что там про старт Вас интересует? Доброе утро! Не ответить - наверное неприлично, хотя уже мало интересно... А для пользы, если есть на русском яыке интересно бы было изучить: 1. Harbour 3. Сборка программы, работа с hbmk 2. Список функций и пример для начинающего по LetoDB 3.... По остальному... Надо посмотреть руквоводство любезно данное Dima.

AlexMyr: AndreyZh пишет: 1. Harbour 3. Сборка программы, работа с hbmk Для начала hbmk2 -help Допустим у вас проект из двух файлов p1.prg, p2.prg, создадим pr1.hbp //begin pr1.hbp p1 p2 //end pr1.hbp Собираем: hbmk2 pr1.hbp Если нужно дополнительно подключить библиотеку, тогда //begin pr1.hbp -l<namelib1> -l<namelib2> p1 p2 //end pr1.hbp Больше примеров на SVN\contrib AndreyZh пишет: 2. Список функций и пример для начинающего по LetoDB Изучаем readme.txt и readme_rus.txt, примеры в в letodb/tests

Dima: Вроде не было в этой теме [pre2] set fixed on SET DECIMALS TO 15 ? 33724.30+6120.30 // 39844.600000000010000 [/pre2] Откуда взялась 1 в 11 знаке после запятой ? Ведь не множим , не делим...

AndreyZh: Что по этому примеру, что http://clipper.borda.ru/?1-4-0-00001174-000-0-0-1486729322 на xHarbour при использовании любых функция преобразования чисел к строке получается идентичные результаты... осталось проверить "прародителя" - проверить это на чистом С

AndreyZh: Вдогонку... на VFP 9 так же сложение даёт хвост, но Int там работает, на этом примере правильно

Петр: AndreyZh пишет: осталось проверить "прародителя" - проверить это на чистом С Так вроде ж прародитель Clipper bcc55 #include <stdio.h> [pre2]int main () { double a = 33724.30; double b = 6120.30; printf( "result = %.15f\n", a + b ); printf( "result = %.15f\n", a - b ); return( 0 ); }[/pre2] Вывод result = 39844.600000000005820 result = 27604.000000000003640 PellesC 8.0 result = 39844.600000000005821 result = 27604.000000000003638

Dima: AndreyZh пишет: но Int там работает, на этом примере правильно А что покажет Foxpro на такой пример ? [pre2] local n := (3.14 ^ 3.14 ^ 3.14 ^ 3.14) / 0.002 ? n ? int(n) [/pre2] Harbour 1211955117675862000.00 1211955117675862528

AndreyZh: Просто есть fox под руками - вот и проверил. Win 10/64

Петр: [pre2]PROCEDURE main() LOCAL n := (3.14 ^ 3.14 ^ 3.14 ^ 3.14) / 0.002 ? n ? Int( n ) SET FIXED ON SET DECIMALS TO 15 ? 33724.30+6120.30 // 39844.600000000010000 RETURN C:\ALASKA\XPPW32\bin>pbuild.bat test_f.prg Xbase++ (R) Compiler 1.90.331 Apr 27 2006 Copyright (c) Alaska Software. All rights reserved. File: C:\ALASKA\XPPW32\bin\test_f.prg Line: 13 File C:\ALASKA\XPPW32\bin\test_f.prg successfully compiled. Alaska 32-Bit Linker Version 1.90.331 Copyright (c) Alaska Software 1997-2006. All rights reserved. 1211955117675862000,00 1211955117675862000 39844,600000000010000[/pre2]

Dima: Петр пишет: 39844,600000000010000 А Excel считает без "хвоста"

Петр: У всех свои правила - вот знать бы их Но harbour, xharbour, xbase++ и, думаю, clipper пользуются одним и тем же правилом.

Dima: Петр Да в Clipper такой же результат (проверил)

Pasha: Петр пишет: У всех свои правила - вот знать бы их Но harbour, xharbour, xbase++ и, думаю, clipper пользуются одним и тем же правилом. Все эти операции выполняет одно и то же устройство - FPU, и думается, выполняет одинаково. Не забывайте, что числа хранятся в двоичном представлении, то есть с базой 2. Отображаются они в привычном для нас десятичном формате. Для преобразования числа в строковое представление с базой 10 необходимо выполнить массу арифметических операций: в основном это операции вычитания и умножения или деления на 10. Эти операции во-первых могут выполняться по разному и в разной последовательности, во вторых каждая такая операция тоже дает некоторую погрешность, обычную для операций fpu. Отсюда получается различный результат для разных компиляторов и программных комплексов.

Pasha: Вот сам нарвался на ситуацию: Есть простое суммирование поля с размерностью N, 12, 2. Суммируется около 2 тыс значений В итоге получается результат: 6947703.00000001 Набегает погрешность 10 нанорублей, или 1 микрокопейка Я бы и не заметил такую погрешность, но результат передается в Excel, а там в строке ввода погрешность видно. Пользователи нервничают, ну как обычно

rvu: Pasha пишет: В итоге получается результат: 6947703.00000001 Набегает погрешность 10 нанорублей, или 1 микрокопейка Я еще когда на клиппере писал, стал в таких случаях писать округление до копейки для каждого числа, которые после округления суммировал. По логике это округление не нужно, но приходилось, чтобы таких ошибок не было.

Dima: Pasha пишет: Есть простое суммирование поля с размерностью N, 12, 2. Суммируется около 2 тыс значений Тут вопрос возникает. Округлять результат операции суммирования для всех 2 тыс значений или только конечную цифру ?

Pasha: Достаточно конечную цифру, я так и делаю



полная версия страницы