Форум: "Потрепаться";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизКалькулятор Найти похожие ветки
← →
Sandman25 © (2004-08-10 12:31) [520][518] Думкин © (10.08.04 12:27)
Нажимаешь комбинацию клавиш, и код в Delphi изbegin
for i:=1 to 15 do s:= s+ 1;
end
становитсяbegin
for I := 1 to 15 do
S := S + 1;
end
Причем вид кода настраивается по желанию.
Есть эксперт для D6 и выше
← →
Sandman25 © (2004-08-10 12:32) [521]Соврал. Написано, что работает, начинаяч с D2
← →
Думкин © (2004-08-10 12:33) [522]Нет, не пользуюсь и не хочу. :)
← →
Sandman25 © (2004-08-10 12:36) [523][522] Думкин © (10.08.04 12:33)
Везет тебе. Мне тут на новом месте дали кучу чужого кода сопровождать. Без форматтера я бы загнулся :)
← →
Думкин © (2004-08-10 12:44) [524]> [523] Sandman25 © (10.08.04 12:36)
Чур меня чур. У меня чужой, как правило, это VCL.
А тебе - Кысмет, однако. :)
← →
GrayFace © (2004-08-11 13:25) [525]Sandman25
А на какой комбинации клавиш этот форматер?
Думкин © (10.08.04 12:19) [515]
> У тебя надо уже код смотреть. Хотя я бы от неявного
>умножения отказался.
> И неплохо было бы если бы ты написал, что же он у тебя
> может, чтобы отклонение от этого можно было бы считать
> ошибкой. А то вдруг ты скажешь, что это фича?
Вот так можно отказаться от неявного умножения:const EmptyMul=false;
В GrayFace (30.07.04 10:48) [338] есть спецификация калькулятора.
← →
Юрий Зотов © (2004-08-11 13:58) [526]> GrayFace © (11.08.04 13:25) [525]
Неявное умножение надо убирать, и из спецификации тоже. Иначе возникает неоднозначность.
Например, 3+3 - это что? Сложение или неявное умножение? Один скажет - сложение, другой - умножение. И оба будут правы, потому что спецификация допускает и то, и другое.
← →
Думкин © (2004-08-11 15:08) [527]1.1.1 - что это?
← →
Юрий Зотов © (2004-08-11 15:39) [528]> Думкин © (11.08.04 15:08) [527]
То же самое, но с еще худшими последствиями: 1.2.3 - это что?
Возможные варианты:
1.0 * 2.0 * 3 = 6
1 * 0.2 * 0.3 = 0.06
1.2 * 0.3 = 0.36
1.0 * 2.3 = 2.3
Спецификация допускает любой вариант. Тестировать невозможно.
← →
Думкин © (2004-08-11 15:48) [529]> [528] Юрий Зотов © (11.08.04 15:39)
Именно. Но получил только:
> не баг, а фича:
> (1.1).1=(1.1)*0.1=0.11
> 1.(1.1)=1.0*(1.1)=1.1
Вот и все. :(
← →
VMcL © (2004-08-11 15:51) [530]>>Думкин © (11.08.04 15:48) [529]
Ого. Скобки, типа, по рэндому расставляются? "Я фигею, дорогая редакция".
← →
Mihey_temporary © (2004-08-11 21:39) [531]М-да, из-за всяких гопников, которые воруют у людей вещи на пляжах, сразу потеряна куча времени. Надеюсь выпустить калькулятор на выходных.
← →
Думкин © (2004-08-12 05:53) [532]> [530] VMcL © (11.08.04 15:51)
Нет, скобки поставил я - и оно посчиталось как написано. Но это непрозрачно и из спецификации мне не очевидно, что должно быть так, хотя возможно и не прав.
← →
Sandman25 © (2004-08-12 09:11) [533][525] GrayFace © (11.08.04 13:25)
А на какой комбинации клавиш этот форматер?
Это эксперт к Delphi, его сначала скачать и установить надо. Поищите DelForEx в какой-нибудь поисковой системе, а то я уже не помню, откуда его скачивал.
← →
GrayFace © (2004-08-12 13:17) [534]Юрий Зотов © (11.08.04 15:39) [528]
Думкин © (11.08.04 15:48) [529]
Ну если читать спецификацию слева на право и пытаться выделить наибольший кусок, подходящий под <Operand>, то будет так, как делает калькулятор.
Вот без неявного умножения:<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | <Separator>{Digit}[<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><operand>
<operand> ::=[{Sign}]<operand>|<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<factor> ::=<operand>[{ "^" <operand>}]
<term> ::=<factor>[{<Operation1><factor>}]
<expression> ::=<term>[{<Operation2><term>}]
← →
Григорьев Антон © (2004-08-13 07:59) [535]Вот, кстати, в "Статьях" наткнулся: "Программирование математических приложений, Дьяченко Евгений" (http://www.delphimaster.ru/articles/mathprogramming.html). Там тоже есть алгоритм распознования формулы. Ссылка на полную реализацию этого алгоритма (см. в статье ссылку "Математика v0.5" даёт у меня перманентную 500-ую ошибку, но, судя по тому, что есть в статье, калькулятор тоже без теории написан.
← →
Юрий Зотов © (2004-08-13 10:05) [536]> Григорьев Антон © (13.08.04 07:59) [535]
> судя по тому, что есть в статье, калькулятор тоже
> без теории написан.
Следствием чего стало такое признание автора (примечание курсивом мои - они переводят обтекаемую форму высказываний на "прямую" речь):
"В заключении, хочу отметить, что приведенный алгоритм является не совсем полным (т.е. просто неполным - ЮЗ). Он будет работать с определенными ограничениями (т.е. умеет распознавать лишь какие-то частные случаи формул - ЮЗ). Для того, что бы программа умела работать с абсолютно любыми формулами, необходимо решить огромное количество мелких и достаточно простых проблем (на самом деле количество таких проблем не "огромно", а бесконечно, потому что бесконечно количество самих формул - следовательно, без применения обобщающего (т.е. теоретического) подхода решить их ВСЕ попросту нельзя - ЮЗ), их можно назвать предельными случаями, которые требуют отдельного описания в программе. Основные проблемы возникают со знаком минуса и раскрытием скобок (вот где уж точно не возникает совершенно никаких проблем, если знать, как это делается - ЮЗ). В процессе написания программы эти проблемы быстро решаются, если их обнаружить, что не всегда легко (а говоря без обиняков, обнаружить ВСЕ эти проблемы не просто "не всегда легко", а попросту невозможно, в силу уже отмечавшейся бесконечности их количества - ЮЗ)".
← →
Юрий Зотов © (2004-08-13 10:15) [537]Забыл добавить.
То есть, читать следует так: "Народ, я тут написал нечто такое, что когда-то работает, а когда-то не работает, причем никому точно неизвестно, когда оно работать будет, а когда нет".
← →
Григорьев Антон © (2004-08-13 10:34) [538]
> Юрий Зотов © (13.08.04 10:15) [537]
> Забыл добавить.
>
> То есть, читать следует так: "Народ, я тут написал нечто
> такое, что когда-то работает, а когда-то не работает, причем
> никому точно неизвестно, когда оно работать будет, а когда
> нет".
Именно на это я и намекал :))
← →
Mihey_temporary © (2004-08-14 18:51) [539]Работа над калькулятором в завершающих стадиях. Правда, уже замечен огромный недочёт - малая скорость работы программы (на выражениях определённого вида).
Кроме того, хочу предупредить, что первоначально я код публиковать не буду, а ещё разок пройдусь по нему, подкорректирую и тогда опубликую (и это будет через неделю после выкладывания самого калькулятора).
← →
Mihey_temporary © (2004-08-14 23:17) [540]Завтра, т.е. в воскресенье железно выложу калькулятор. Помнится, была ветка, где кто-то без цели считал степени двойки, вплоть до 2^64. Однако на моём калькуляторе удалось сосчтитать 2 в 256 степени и это число:
115 792 089 237 316 195 423 570 985 008 687 907 853 269 984 665 640 564 039 457 584 007 913 129 639 936
← →
Nous Mellon 22 (2004-08-14 23:44) [541]Я уже пол-России проехал, а воз и ныне там :-)
← →
Думкин © (2004-08-15 06:53) [542]> Mihey_temporary © (14.08.04 23:17)
Я считал. Только намного больще - это занимало несколько строк. Вот степень не помню, но много больше 256. И 1000! приводил тут. :))
← →
GrayFace © (2004-08-15 10:08) [543]Юрий Зотов
Сегодня воскреенье - выходной.
← →
Mihey_temporary © (2004-08-15 23:56) [544]> Cobalt © (26.07.04 23:28) [148]
>1/sin(1,1222-1,22221)
Очекнь странное сообщение выдал - "Два действия подряд! [02А]"
Ничего не понимаю...
P.S. а виндовый калькулятор слопал, выдал -0,10001
Виндовый калькулятор, конечно, работает правильно, не спорю, но и ты забыл кнопочку "=" нажать :).
← →
Mihey_temporary © (2004-08-15 23:57) [545]Упс, поторопился :) просто проверял выражения, ставшие переломными для первой версии и нашёл разногласия.
← →
Mihey_temporary © (2004-08-16 00:12) [546]Звиняйте великодушно. Не успел зарелизить. Калькулятор готов, но не доделаны правила, вылезла ошибка в крэш-тесте на 300+ выражений (ошибка не калькулятора, а самого сравнителя), не успеваю запаковать и выложить :). Видимо, откладывается до завтра.
← →
Mim1 © (2004-08-16 07:22) [547]Чтото мне старичек Эдельвейс спомнился, из "Понедельник наступает в субботу".
← →
Думкин © (2004-08-16 07:51) [548]> [547] Mim1 © (16.08.04 07:22)
Это не там. Это в "Сказке о тройке".
← →
Mihey_temporary © (2004-08-16 16:54) [549]Expression Calculator v.0.2
http://www.hot.ee/gelphi/ExpCalc.zip
Всё-таки зарелизил. Необходимо было ещё 2 часа на то, что не успел вчера.
Несколько слов. Эту версию прошу считать беткой. За парсер я уверен, не совсем уверен за калькулятор - хочу проработать код ещё раз. Тогда и опубликую его. Кроме того, известны несколько глюков:
Не отлавливается ошибочность выражения типа sin2. Точнее, программа сообщает о внутренней ошибке, но я понимаю, что нужно сделать проверку этого дела с выводом более вразумительного сообщения.
При исключениях не исчезает надпись "Считаю". Забыл влепить исчезалку в try...finally...end. Мелочь, но всё же.
Пока что программа не работает с периодами. Т.е. 2/3*3 выдаст 2.000...00001, а не 2, так как промежуточный результат (2/3) был записан ввиде конечной десятичной дроби. В дальнейшем планируется устранить неточность.
И, наконец, внимание! Используйте точку в качестве десятичного разделителя.
← →
Mihey_temporary © (2004-08-16 16:55) [550]Размер архива 250 Кб.
← →
nikkie © (2004-08-16 17:18) [551]удивляет, почему так долго и неточно считает sin.
судя по [540] внутрях реализована длинная арифметика, видимо из-за этого.
sin(3.1415926)
0.0548036642148768366804128756572852742855831
(на calc.exe: 5,3589793238462617732829186571369e-8)
sin(3.1415926535897932384626433832795)
0.0548036651487895308877487135398332038025398
(на calc.exe: 5,0288419841092213655485729692158e-31)
← →
Mihey_temporary © (2004-08-16 17:25) [552]Почему неточно?
sin(3.1415926) выдаёт:
0.054803664 - карманный калькулятор
0,0548036642148768366804128756572853 - калькулятор Windows
0.0548036642148768366804128756572852742855831 - моё творение
← →
nikkie © (2004-08-16 17:44) [553]не заметил я вот этого:
>Аргумент функций sin, cos, tan (или tg) предполагается в градусах.
по поводу неточности возражение снимается. но все-таки долго очень...
27^(1/3) - через 10 минут счета я снял задачу.
может убрать пока длинную арифметику и сделать на Double/Extended + стандартная реализация функций? все-таки длинная арифметика за пределами поставленной задачи.
← →
nikkie © (2004-08-16 17:47) [554](+2))(
Access Violation
← →
Mihey_temporary © (2004-08-16 18:43) [555]
> (+2))(
> Access Violation
Действительно, не учёл, хотя занимался этим. Но, скажем, выражение составлено не по правилам. Больше интересуют ошибки парсера и калькулятора.
← →
Mihey_temporary © (2004-08-16 18:47) [556]Длинную арифметику я тогда сниму пока что.
Кроме того, забыл ещё про один глюк рассказать. Дробная степень реализуется через корень, при этом отсутсвует проверка на корень чётной степени из отрицательного числа.
← →
nikkie © (2004-08-16 18:49) [557]я потратил полчаса на тестирование, обнаруженные глюки описал.
по-моему достаточно для начала. может еще кто изъявит желание потестировать, но мне хотелось бы тестировать тогда, когда 27^(1/3) будет вычислять в пределах 1 секунды.
← →
Mihey_temporary © (2004-08-16 18:55) [558]2 nikkie:
Но пока что нет такого, что правильное выражение (которое можно посчитать) считает неправильно либо не считает вообще. Из глюков обнаружен один.
← →
nikkie © (2004-08-16 19:05) [559]>Дробная степень реализуется через корень
это как?
(-1)^(3.5)
"- is not an integer value"
(-1)^(3.6)
1
(-1)^(3.7)
-4878.3912434420340881330505872785786504673713417
← →
Mihey_temporary © (2004-08-16 20:17) [560]2 nikkie:
Согласен, степень хромает всё же слишком.
Страницы: 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
19 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 1.58 MB
Время: 0.268 c