Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.57 MB
Время: 0.048 c
15-1158636507
Весь в делах
2006-09-19 07:28
2006.10.08
Какую лапшу на уши вешают?


2-1158745919
id
2006-09-20 13:51
2006.10.08
Добавление строки в ListView


15-1157999045
DillerXX
2006-09-11 22:24
2006.10.08
Рисуете ли вы блок-схемы при написании программ?


15-1158293590
DemoN__
2006-09-15 08:13
2006.10.08
Какой прокси лучше поставить на dsl в инет кафе?


15-1158584053
Layner
2006-09-18 16:54
2006.10.08
В каком формате справку к программе писать?