Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизКак узнать количество знаков после запятой? Найти похожие ветки
← →
arhis (2006-09-21 16:57) [0]узнаю так:
met:=2;
PrBuf:=(Deal.Price-Int(Deal.Price))*10;
While true do
begin
PrBuf:=PrBuf*10;
if (PrBuf-Int(PrBuf))=0 then break;
inc(met);
end;
работает кроме случая 100.023
В этом случае релультат вычитания аномален.
Может это вообще можно както прощще сделать?
← →
Ketmar © (2006-09-21 17:00) [1]можно. считать, что их всегда, например, 8.
← →
arhis (2006-09-21 17:01) [2]мне нужно количество но не меньше двух. Это для печати официального документа
← →
arhis (2006-09-21 17:02) [3]грубо говоря на третьей итерации получаем нечто в виде 23-23=0.0000..000123123
← →
XTD © (2006-09-21 17:02) [4]Отними от твоего числа целое, останется после запятой Length(IntToStr(S))
← →
arhis (2006-09-21 17:05) [5]Int к дроби?
← →
Ketmar © (2006-09-21 17:05) [6]конвертируй в строку, работай со строкой.
← →
arhis (2006-09-21 17:05) [7]или экспонента или сам указывай число знаков а мне и нужно узнать их количество
← →
XTD © (2006-09-21 17:06) [8](5) Умнож на 100
← →
arhis (2006-09-21 17:06) [9]К тому же после таких арифметических вывертов становиться как то очень не спокойно на душе.
← →
palva © (2006-09-21 17:06) [10]Если число представлено с погрешностью, то количество знаков узнать невозможно. Ну а если число представлено точно, то перевести в десятичную систему и посчитать нули.
← →
arhis (2006-09-21 17:07) [11]XTD © (21.09.06 17:06) [8]
Вы алгоритм смотрели? там как раз и умножается а потом вычитается челое, но потом происходит глюк с арифметической операцией, вот я и спрашиваю что я делаю не так. Frac мне вообще от 234 возвращает 1
← →
Наиль © (2006-09-21 17:08) [12]
> if (PrBuf-Int(PrBuf))=0 then break;Uses Math
if IsZero(PrBuf) then break;
← →
Ketmar © (2006-09-21 17:09) [13]>[7] arhis 06-09-21 17:05
>или экспонента или сам указывай число знаков а
>мне и нужно узнать их количество
указать побольше, лишние нули обрезать -- религия запрещает?
← →
Наиль © (2006-09-21 17:09) [14]В [12] опечатку сам исправишь
← →
arhis (2006-09-21 17:12) [15]Наиль © (21.09.06 17:08) [12]
Пробовал не определяет как ноль
← →
arhis (2006-09-21 17:13) [16]2,842*10-14 это не ноль
← →
arhis (2006-09-21 17:18) [17]Ketmar © (21.09.06 17:09) [13]
Да, моя религия мне не позволяет чисто математическую задачу решать чернез строки. К тому же повторюсь уж слишком смущает столь экстравагантный результат простейшей математической операции.
← →
Ketmar © (2006-09-21 17:19) [18]>[17] arhis 06-09-21 17:18
>тому же повторюсь уж слишком смущает столь
>экстравагантный результат простейшей
>математической операции.
"это дубли у нас простые" (ц)
← →
arhis (2006-09-21 17:56) [19]Тайна сия велиуа есть.
0.0012 работает
0.0011 не работает
← →
han_malign © (2006-09-21 18:30) [20]
> Тайна сия велиуа есть.
- угу, тебе число Пи до какого знака выводить?
Ты вообще понимаешь, что каждый раз когда умножаешь на 10 - увеличиваешь в 10 раз погрешность?
У extended 19-20 - значимых цифр, умножив на 100 - 100.023 ты и получаешь погрешность в (19-5)-знаке(2,842*10-14), и дальше эта погрешность может увеличиваться... Другое дело, что, в зависимости от конкретного значения, погрешность умножения на 10 может быть и нулевой - но это скорее исключение.
← →
Ketmar © (2006-09-21 18:37) [21]>[20] han_malign(c) 06-09-21 18:30
аффтару на это уже намекали. %-)
← →
arhis (2006-09-21 18:52) [22]han_malign © (21.09.06 18:30) [20]
я не совсем понимаю причем тут погрешности?
Я беру число 0,023 и умножаю его на 100, и всегда получаю 2,3 хоть тресни. потом умножаю еще на десять и получаю 23. Потом просто вычитаю из 23 23 и не получаю нуля?
Где моя логика неправа?
← →
arhis (2006-09-21 18:54) [23]Ketmar © (21.09.06 18:37) [21]
Вы, сударь попытались бы лучше объяснить в чем проблема а не упражнятся в намеках. Насколько я понимаю ветка называется начинающим? Я по адресу попал?
← →
Ketmar © (2006-09-21 19:34) [24]>[23] arhis 06-09-21 18:54
>Ketmar c (21.09.06 18:37) [21]
>Вы, сударь попытались бы лучше объяснить в чем
>проблема а не упражнятся в намеках.
я, вообще-то, сам решу, как и что мне писать. предпочитаю учить работать головой, а не челюстями. если в голове есть моск, то намёка достаточно. если нет -- то даже открытый текст не поможет.
← →
Virgo_Style © (2006-09-21 19:37) [25]arhis (21.09.06 18:52) [22]
я не совсем понимаю причем тут погрешности?
if Trunc( 10 ) = 0 then Label1.Caption:="ровно десять" else Label1.Caption:="имеется погрешность";
← →
Ketmar © (2006-09-21 19:41) [26]>[25] Virgo_Style(c) 06-09-21 19:37
это что такое, позвольте спорсить? не бывает погрешностей у целых чисел. %-)
← →
palva © (2006-09-21 19:58) [27]> Я беру число 0,023 и умножаю его на 100, и всегда получаю 2,3 хоть тресни.
В этом случае вы правы. Но ваша программа ведь делает другое. Число 0,023 не представимо точно в 2 с/c, значит любая двоичная ЭВМ будет хранить его приближенно в виде округленной периодической дроби. При умножении на 100 разрядная сетка числа переполнится, поэтому процессор также округлит результат. В результате вы не получите 2,3. Тем более, что число 2,3 также невозможно представить в ЭВМ, хоть тресни. Другое дело, что если вы переведете результат в 10 с/с и округлите до десятых, то получите 2,3. В задачах подобных вашей числа хранят в виде целых чисел (как результат умножения исходных чисел на какое нибудь большое число) либо в виде десятичных дробей, но тогда самостоятельно реализуют арифметику на таких числах или используют готовые пакеты.
Вопросы подобные вашим задаются раз в неделю и уже всем надоели. Тем более, что они часто сопровождаются нежеланием задающего вопрос понять, что происходит на самом деле, и как там внутри всё устроено. Отсюда такая реакция. Не обижайтесь.
← →
Virgo_Style © (2006-09-21 19:59) [28]Ketmar © (21.09.06 19:41) [26]
Это... хм. Глупость какая-то, по всей видимости %-)
← →
Ketmar © (2006-09-21 20:43) [29]>[28] Virgo_Style(c) 21-Sep-XLI A.S., 19:59
>Это... хм. Глупость какая-то, по всей видимости %-)
почему-то и мне так показалось. %-)
← →
Palladin © (2006-09-22 08:29) [30]
> arhis
используй Currency и не мучайся
← →
arhis (2006-09-22 10:36) [31]Ketmar © - флудер.
palva © (21.09.06 19:58) [27]
Честно сказать я не очень понимаю почему дебаггер мне радостно докладывает что у меня и там и там 23 а вычесть их не может. Странное поведение системы в целом. Меня не волнуют с какой погрешностью комп посчитал что в этой ячейке у меня 23. Ему самому на это наплевать когда он мне показывает что там 23 а при арифметической операции он вдруг про эту погрешность вспоминает.
Особенно мне это не понятно изза того что программа только и делает что умножает на 10 в разных степенях и никаких проблем до этого момента не было.
По поводу остального могу сказать что не даром обратился в форум для начинающих и уж тем более никогда не задумывался о представлении чисел в двоичной системе. У меня совершенно другие задачи
← →
Ketmar © (2006-09-22 10:41) [32]>[31] arhis 22-Sep-XLI A.S., 10:36
>Ketmar c - флудер.
ты не первый. тут где-то на сайте есть ссылочка -- "написать админу". можешь поделиться с Максимом ценным наблюдением. или вот -- отписать конкретно модератору этого раздела. говорят, тоже помогает.
← →
Ketmar © (2006-09-22 10:42) [33]вдогон: интересно, какие должны быть задачи, если задумываться о том, как машина представляет числа -- не надо. "трамвай работает так -- вж-ж-ж, дзинь, дзинь"?
← →
Amoeba © (2006-09-22 11:31) [34]Автору вопроса настоятельно рекомендуется прочесть статью "Неочевидные особенности вещественных чисел":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
← →
Наиль © (2006-09-22 11:43) [35]
> [15] arhis (21.09.06 17:12)
Я смотрю ты так и не удосужился разобраться с [12]+[14].
Показываю ещё раз
Твой вариантif (PrBuf-Int(PrBuf))=0 then break;
Правильный вариантUses Math
if IsZero(PrBuf-Int(PrBuf)) then break;
Посмотри устройство IsZero.
← →
han_malign © (2006-09-22 12:15) [36]
> дебаггер мне радостно докладывает что у меня и там и там 23
- потому, что, те кто писал дебагер, в отличие от вас, знали об особенностях машинного представления чисел с плавающей точкой, и дебагер писали - в первую очередь, для тех кто знает... А для тупых - разразработчики VCL - написали FloatToStr, и ваша фраза "Да, моя религия мне не позволяет чисто математическую задачу решать чернез строки." - не котируется, до тех пор, пока вы в этой "чисто математике" не разберетесь...
← →
arhis (2006-09-22 12:48) [37]Наиль © (22.09.06 11:43) [35]
А я тебе еще раз говорю, что эта чертова погрешность не ноль.
han_malign © (22.09.06 12:15) [36]
Господа, у вас тут некоторые непонятности в масштабах происходящего. Судя по вашей сетевой активности все вы тут читали про закон дырявых абстракций. Если учесть что любой человек, который пишет в дельфях находится на самой вершине этой иерархии абстаракций, именно по этому я и пишу в дельфях, система должна была меня оградить от такой дыры прямо в фундаменте. Я, грешным делом, думал что так оно и есть. Что, по моему в полне очевидно, потому как этому самому королю горы абстракций, то есть мне, глубочайше все равно с какой погрешностью рассчитан этот ноль. И в какой системе он находиться, да хоть в десятичных остатках.
Теперь по поводу тупых. У моего учителя по математике была любимая поговорка - пускай рабы считают . Любой программист, это в первую очередь алгоритмист, и алгоритм и есть его цель, все остальное для рабов.
Простите меня за столь откровенный флуд, Ketmar © с утра так настроил.
В заключении хочу сказать спасибо Palladin © , который не стал выпендриваться и хоть как то закрыл мне эту дыру.
← →
Virgo_Style © (2006-09-22 13:21) [38]arhis (22.09.06 12:48) [37]
Господа, у вас тут некоторые непонятности в масштабах происходящего.
Плакал.
arhis (22.09.06 12:48) [37]
королю горы абстракций, то есть мне
Рыдал!!!)
← →
han_malign © (2006-09-22 13:40) [39]
> Любой программист, это в первую очередь алгоритмист, и алгоритм
> и есть его цель, все остальное для рабов.
- а у любого землекопа единственная цель - копать землю, а то что непонятно как копать каменистую землю совковой лопатой, и на фиг тут лежит какой то с(т)ранный заступ - так это явно недоработка изготовителей - они и виноваты...
← →
han_malign © (2006-09-22 13:51) [40]
> У моего учителя по математике была любимая поговорка - пускай рабы считают.
- а если название дисциплин - "Численные методы" и "Дискретная математика" - вызывают у вас недоумение, вам лень изачать иснтрументарий - то, для уровня ваших абстрактых амбиций, прекрасно подойтет Visual Basic Scripts в MSOffice...
"Microsoft - ты думаешь за нас"...
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.55 MB
Время: 0.058 c