Як дізнатися кількість знаків після коми

Як дізнатися кількість знаків після коми?


met: = 2;
PrBuf: = (Deal.Price-Int (Deal.Price)) * 10;
While true do
# XA0; begin
# XA0; PrBuf: = PrBuf * 10;
# XA0; if (PrBuf-Int (PrBuf)) = 0 then break;
# XA0; inc (met);
# XA0; end;

працює крім випадку 100.023
В цьому випадку релультат вирахування аномальний.
Може це взагалі можна якось прощще зробити?

можна, можливо. вважати, що їх завжди, наприклад, 8.

мені потрібно кількість але не менше двох. Це для друку офіційного документа

грубо кажучи на третій ітерації отримуємо щось у вигляді 23-23 = 0.0000..000123123

Забери від твого числа ціле, залишиться після коми Length (IntToStr (S))

конвертуються в рядок, працюй з рядком.

або експонента або сам вказуй число знаків а мені і потрібно дізнатися їх кількість

До того ж після таких арифметичних вивертів ставати як то дуже неспокійно на душі.

Якщо число представлено з похибкою, то кількість знаків дізнатися неможливо. Ну а якщо число представлено точно, то перевести в десяткову систему і порахувати нулі.


> # XA0; if (PrBuf-Int (PrBuf)) = 0 then break;

Uses Math
if IsZero (PrBuf) then break;

> [7] arhis 06-09-21 17:05
> Або експонента або сам вказуй число знаків а
> Мені і потрібно дізнатися їх кількість
вказати побільше, зайві нулі обрізати - релігія забороняє?

В [12] опечатку сам виправиш

2,842 * 10-14 це не нуль

> [17] arhis 06-09-21 17:18
> Того ж повторюся аж надто бентежить настільки
> Екстравагантний результат найпростішої
> Математичної операції.
"Це дублі у нас прості" (ц)

Ця таємниця Веліу є.
0.0012 працює
0.0011 не працює


> Ця таємниця Веліу є.

- угу, тобі число Пі до якого знака виводити?
Ти взагалі розумієш, що кожен раз коли множити на 10 - збільшуєш в 10 разів похибка?
У extended 19-20 - значущих цифр, помноживши на 100 - 100.023 ти і отримуєш похибка в (19-5) -Знаки (2,842 * 10-14), і далі ця похибка може збільшуватися. Інша справа, що, в залежності від конкретного значення, похибка множення на 10 може бути і нульовою - але це швидше виняток.

> [20] han_malign (c) 06-09-21 18:30
аффтар на це вже натякали. % -)

я не зовсім розумію до чого тут похибки?
Я беру число 0,023 і множу його на 100, і завжди отримую 2,3 хоч трісни. потім множу ще на десять і отримую 23. Потім просто вичитав з 23 23 і не отримую нуля?
Де моя логіка неправа?

> [23] arhis 06-09-21 18:54
> Ketmar c # XA0; (21.09.06 18:37) [21]
> Ви, пане спробували б краще пояснити в чому
> Проблема а не вправляючись в натяках.
я, взагалі-то, сам вирішу, як і що мені писати. Краще вже вчити працювати головою, а не щелепами. якщо в голові є моск, то натяку досить. якщо немає - то навіть відкритий текст не допоможе.

arhis # XA0; (21.09.06 18:52) [22]
я не зовсім розумію до чого тут похибки?

if Trunc (10) = 0 then Label1.Caption: = "рівно десять" else Label1.Caption: = "є похибка";

> [25] Virgo_Style (c) 06-09-21 19:37
це що таке, дозвольте спорсіть? не буває помилок у цілих чисел. % -)

> Я беру число 0,023 і множу його на 100, і завжди отримую 2,3 хоч трісни.
В цьому випадку ви маєте рацію. Але ваша програма адже робить інше. Число 0,023 НЕ представимо точно в 2 с / c, значить будь-яка двійкова ЕОМ буде зберігати його наближено у вигляді округленої періодичної дробу. При множенні на 100 розрядна сітка числа переповниться, тому процесор # XA0; також округлити результат. В результаті ви не отримаєте 2,3. Тим більше, що число 2,3 також неможливо уявити в ЕОМ, хоч трісни. Інша справа, що якщо ви перекладете результат в 10 з / с і округлите до десятих, то отримаєте 2,3. У завданнях подібних вашої числа зберігають у вигляді цілих чисел (як результат множення вихідних чисел на яке-небудь велике число) або у вигляді десяткових дробів, але тоді самостійно реалізують арифметику на таких числах або використовують готові пакети.

Питання подібні вашим задаються раз в тиждень і вже всім набридли. Тим більше, що вони часто супроводжуються небажанням задає питання зрозуміти, що відбувається насправді, і як там всередині все влаштовано. Звідси така реакція. Не ображайтеся.

> [28] Virgo_Style (c) 21-Sep-XLI A.S. 19:59
> Це. хм. Дурість якась, по всій видимості% -)
чомусь і мені так здалося. % -)

Чесно сказати я не дуже розумію чому дебагер мені радісно доповідає що у мене і там і там 23 а відняти їх не може. Дивна поведінка системи в цілому. Мене не хвилюють з якою похибкою комп порахував що в цьому осередку у мене 23. Йому самому на це наплювати коли він мені показує що там 23 а при арифметичній операції він раптом про цю похибку згадує.
Особливо мені це не зрозуміло через те що програма тільки і робить що множить на 10 в різних ступенях і ніяких проблем до цього моменту не було.

З приводу решти можу сказати що не дарма звернувся в форум для початківців і вже тим більше ніколи не замислювався про подання чисел в двійковій системі. У мене зовсім інші завдання

> [31] arhis 22-Sep-XLI A.S. 10:36
> Ketmar c - флудер.
ти не перший. тут десь на сайті є ссилочку - "написати адміну". можеш поділитися з Максимом цінних наглядом. або ось - відписати конкретно модератору цього розділу. кажуть, теж допомагає.

навздогін: цікаво, які повинні бути завдання, якщо замислюватися про те, як машина являє числа - не треба. "Трамвай працює так - вж-ж-ж, дзень, дзень"?


> [15] arhis # XA0; (21.09.06 17:12)

Я дивлюся ти так і не спромігся розібратися з [12] + [14].
Показую ще раз
твій варіант
if (PrBuf-Int (PrBuf)) = 0 then break;

Правильний варіант
Uses Math
if IsZero (PrBuf-Int (PrBuf)) then break;

Подивися пристрій IsZero.


> Дебагер мені радісно доповідає що у мене і там і там 23

- тому, що, ті хто писав дебагер, на відміну від вас, знали про особливості машинного представлення чисел з плаваючою точкою, і дебагер писали - в першу чергу, для тих хто знає. А для тупих - разразработчікі VCL - написали FloatToStr, і ваша фраза "Так, моя релігія мені не дозволяє чисто математичну задачу вирішувати Чернезі рядки." - не котується, до тих пір, поки ви в цій "чисто математики» не розберетеся.

А я тобі ще раз кажу, що ця чортова похибка не нуль.

Господа, у вас тут деякі незрозумілості в масштабах відбувається. Судячи з вашої мережевої активності все ви тут читали про закон дірявих абстракцій. Якщо врахувати що будь-яка людина, яка пише в Дельфах знаходиться на самій вершині цієї ієрархії абстаракцій, # XA0; саме з цього я і пишу в Дельфах, система повинна була мене захистити від такої діри прямо в фундаменті. Я, грішним ділом, думав що так воно і є. Що, на мою в полне очевидно, тому що цьому самому королю гори абстракцій, тобто мені, глубочайше все одно з якою похибкою розрахований цей нуль. І в якій системі він знаходитися, та хоч в десяткових залишках.

Тепер з приводу тупих. У мого вчителя з математики була улюблена приказка - нехай раби вважають. Будь-який програміст, це в першу чергу алгоритмісти, і алгоритм і є його мета, все інше для рабів.

arhis # XA0; (22.09.06 12:48) [37]
Господа, у вас тут деякі незрозумілості в масштабах відбувається.

arhis # XA0; (22.09.06 12:48) [37]
королю гори абстракцій, тобто мені


> Будь-який програміст, це в першу чергу алгоритмісти, і алгоритм
> І є його мета, все інше для рабів.

- а у будь-якого землекопа єдина мета - копати землю, а то що незрозуміло як копати кам'янисту землю совковою лопатою, і на фіг тут лежить якийсь з (т) ранний заступ - так це явно недоробка виробників - вони і винні.


> У мого вчителя з математики була улюблена приказка - нехай раби вважають.

- а якщо назва дисциплін - "Чисельні методи" і "Дискретна математика" - викликають у вас здивування, вам ліньки ізачать існтрументарій - то, для рівня ваших абстрактний амбіцій, прекрасно подойтет Visual Basic Scripts в MSOffice.
"Microsoft - ти думаєш за нас".

Пам'ять: 0.81 MB
Час: 0.05 c

Схожі статті