Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Как узнать количество знаков после запятой?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.07 c
2-1158672632
RomanH
2006-09-19 17:30
2006.10.08
Директории-> поддиректории


15-1158504021
Nic
2006-09-17 18:40
2006.10.08
Кросс наций


15-1158496222
TStas
2006-09-17 16:30
2006.10.08
Как за сделать, чтобы сайт в поискухе вылазил среди первых?


2-1158829400
fifi01
2006-09-21 13:03
2006.10.08
TStringList


2-1158321256
DmiSb
2006-09-15 15:54
2006.10.08
Как узнать какое поля ввода потеряло фокус ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский