Как найти количество знаков после запятой

Not really, the number of decimal places is a function of the internal representation of the number. What you see when you display the number is, is the number as a string for printing.

So if you are interested in the displayed value, you can control the number of decimal places with formatting directives in the first place e.g., %5.2f, or use the string function approach as you mention in your post after the fact once you have the number as a string.

Also, as an aside, would you count trailing zeros?

Perhaps it would be helpful to state your goal for wanting to do this? There might be other ways to accomplish what you are looking to do.

Update:

Based on your update, the problem is really not counting decimal places, rather you are running into represenation issue/rounding errors (not that uncommon). The problem is that some fractional values can’t be exactly represented in base 2. Here’s an exhaustive explanation: What Every Computer Scientist Should Know About Floating-Point Arithmetic.

Take a look at this SO question: Understanding floating point representation errors; what’s wrong with my thinking?

You can try this approach to round the value:

float rounded_val = floorf(value * 100.0 + 0.5) / 100.0; 

Wikipeadia has a whole article on rounding.

0 / 0 / 0

Регистрация: 18.01.2014

Сообщений: 6

1

Подсчитать количество цифр после запятой в вещественном числе

23.05.2014, 13:53. Показов 51315. Ответов 21


Студворк — интернет-сервис помощи студентам

Доброго времени суток. Подскажите, пожалуйста, как посчитать кол-во цифр после запятой?
Например в числе 5.4569 -4 знака после запятой. В программе присутствуют как все число n=5.4569,так и дробная часть n1=0.4569.
Заранее спасибо



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

23.05.2014, 13:53

21

newbie666

Заблокирован

23.05.2014, 13:55

2

перегоняй в строку, находи в строке ‘.’ и считай кол-во буковок (циферок в данном случае) посл точки до конца строки



0



0 / 0 / 0

Регистрация: 18.01.2014

Сообщений: 6

23.05.2014, 13:57

 [ТС]

3

С помощью чего это делать? size()?strlen()?Чего именно?



0



zzzZZZ…

527 / 358 / 94

Регистрация: 11.09.2013

Сообщений: 2,041

23.05.2014, 14:06

4

Цитата
Сообщение от Kolter
Посмотреть сообщение

С помощью чего это делать? size()?strlen()?Чего именно?

itoa();



0



62 / 43 / 20

Регистрация: 28.09.2013

Сообщений: 193

23.05.2014, 14:15

5

dzrkot, itoa() переводит только из int не?



0



DiffEreD

1456 / 793 / 257

Регистрация: 21.06.2011

Сообщений: 1,740

Записей в блоге: 2

23.05.2014, 14:20

6

Цитата
Сообщение от Kolter
Посмотреть сообщение

Например в числе 5.4569 -4 знака после запятой

Это только так кажется:

C++
1
2
3
4
5
6
7
8
int main()
{
   double d = 5.1234;
   std::cout << d << "n"; //5.1234
   std::cout << std::setprecision(60) << d << "n"; //5.123400000000000176214598468504846096038818359375
 
   return 0;
}



1



0 / 0 / 0

Регистрация: 18.01.2014

Сообщений: 6

23.05.2014, 14:26

 [ТС]

7

Ого.Это конечно интересно. Но надо чтобы выводил 4.И c itoa() я совсем запуталась в конверсиях( оба числа типа double. на какой тип конвертировать)



0



newbie666

Заблокирован

23.05.2014, 14:27

8

Лучший ответ Сообщение было отмечено Kolter как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <tchar.h>
#include <iostream>
#include <iomanip> 
#include <sstream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    double number = 3.145926535;    
    std::stringstream ss;
    ss << std::setprecision(15) <<  number;
    std::string strNum = ss.str();
    size_t pos = strNum.find('.');
    if(pos != strNum.npos)          
        std::cout << "Number of digits after comma: " << strNum.size() - 1 - pos << std::endl;  
    else
        std::cout << "Comma not found!" << std::endl;
 
    return 0;   
}



0



0 / 0 / 0

Регистрация: 18.01.2014

Сообщений: 6

23.05.2014, 14:43

 [ТС]

9

newbie666, спасибо, посижу,поразбираюсь

Добавлено через 10 минут
Отлично все работает, огромное вам спасиииибо



0



215 / 63 / 25

Регистрация: 30.04.2013

Сообщений: 865

Записей в блоге: 10

23.05.2014, 15:03

10

DiffEreD, Оооо !
такая точность ? откуда

больше 15 знаков не канает

Добавлено через 2 минуты
у моей машины



1



NuMeRiC_

3 / 3 / 0

Регистрация: 03.06.2019

Сообщений: 64

23.08.2019, 21:47

11

Вот в-я, которая считает вполне нормально, но иногда долго:

C++
1
2
3
4
5
6
7
8
9
10
int Foo(double d) {
    int test = (int)d;
    int count = 0;
    while (test != d) {
        count++;
        d*=10;
        test = (int)d;
    }
    return count;
}



0



Диссидент

Эксперт C

27465 / 17154 / 3780

Регистрация: 24.12.2010

Сообщений: 38,636

23.08.2019, 22:24

12

Для справки.
У переменной типа double нет количества знаков после точки. Просто такое понятие для него не определено.
Оно есть только у его текстового представления.



0



Комп_Оратор)

Эксперт по математике/физике

8846 / 4588 / 619

Регистрация: 04.12.2011

Сообщений: 13,692

Записей в блоге: 16

23.08.2019, 23:33

13

Цитата
Сообщение от Байт
Посмотреть сообщение

У переменной типа double нет количества знаков после точки.

Байт, вот страничка:
https://ru.wikipedia.org/wiki/IEEE_754-2008
Поскольку внутреннее представление 2-чное то в десятичном представлении 64 битное (дабл) по стандарту будет иметь 15-16 разрядов в мантиссе. Они пишут 15.95 (53 двоичных разряда дают то 15 то 16 10-тичных, в зависимости от значения !).
Вопрос топика, недоизучен ТС и требует уточнения формулировки.

Добавлено через 2 минуты
NuMeRiC_, как вам удалось раскопать 2014 год? Раритет как-никак…



1



Диссидент

Эксперт C

27465 / 17154 / 3780

Регистрация: 24.12.2010

Сообщений: 38,636

24.08.2019, 09:45

14

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

53 двоичных разряда дают то 15 то 16 10-тичных,

Зерно истины в этом есть. Но тогда и вопрос должен был быть поставлен по другому. Сколько десятичных знаков имеет тип double?
Хотя… Там говорится о знаках после запятой…. Значит для числа 5.4569 это будет 15(16) – 1 = 14(15)
Что брать за “базу” – 15 или 16 – вопрос достаточно тонкий.
Но таких “задач” на форуме встречалось довольно много. Что я отношу к идиотизму не столько ТС-ов, сколько преподавателей, слабо разбирающихся в данном вопросе.

Добавлено через 6 минут
В свое время мне пришлось создавать функцию “точного” представления плавающих чисел. Сделал просто. ПЕреводил в строку (sprinf(s, “%19f”, d); и искал идущие подряд “000” или “999”, которые отсекал. Числа 19 и 5 были назначены чисто волюнтаристски. Но заказчик был доволен и не брыкался



1



Комп_Оратор)

Эксперт по математике/физике

8846 / 4588 / 619

Регистрация: 04.12.2011

Сообщений: 13,692

Записей в блоге: 16

24.08.2019, 11:57

15

Цитата
Сообщение от Байт
Посмотреть сообщение

Но тогда и вопрос должен был быть поставлен по другому.

Конечно! Я же и говорю:

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

Вопрос топика, недоизучен ТС и требует уточнения формулировки.

Цитата
Сообщение от Байт
Посмотреть сообщение

Но таких “задач” на форуме встречалось довольно много. Что я отношу к идиотизму не столько ТС-ов, сколько преподавателей, слабо разбирающихся в данном вопросе.

Мир удивительно стабилен, в некоторых своих проявлениях.

Цитата
Сообщение от Байт
Посмотреть сообщение

Там говорится о знаках после запятой…. Значит для числа 5.4569 это будет 15(16) – 1 = 14(15)
Что брать за “базу” – 15 или 16 – вопрос достаточно тонкий.

По примеру топика речь о знаках в мантиссе вида a.bcde… где a – не ноль. А недетерминированное в числе знаков 10-чное представление проще всего решить отбросив 16. То есть, для 64-представления IEEE754 уверенно можно говорить о 15 для мантиссы. Так кажется. И три знака для экспоненты + знак самой экспоненты и знак числа экспоненты (песня, название песни, то о чём песня и звучащая песня). То есть e-301 – четыре знака. Стало быть строка для представления в char должна быть не менее 20=15+4 +1. Один – для десятичной точки. Но это для мантиссы с точкой и без ведущего нуля. То есть для человеческого глаза. А в формате где ноль – ведущий (в мантиссе вида 0.bcde…) перед первой значащей (не нулевой) после запятой, можно на точке съэкономить. Но не всем будет понятно.

Добавлено через 44 минуты
Байт, учитывая сказанное, я бы ответил на вопрос ТС так:
Нужно получить столько значащих из матиссы сколько возможно. То есть, например, отбрасываем экспоненту и анализируем 15 ведущих знаков мантиссы для того чтобы выбросить сплошную, замыкающую группу нулей (если есть хоть один, – уже один знак отбросим). Тогда можно получить менее 15 10-чных цифр (значащих уже можно сказать) не изменив точность (с точностью до 16-го знака в некоторых случаях).
То есть, если быть предельно точным, то нельзя быть предельно точным )))



1



Байт

Диссидент

Эксперт C

27465 / 17154 / 3780

Регистрация: 24.12.2010

Сообщений: 38,636

24.08.2019, 23:51

16

Копая нонче картошку на огороде (а она выдалась на диво – с кулак!), пришел, как мне кажется, к разумному решению. Что-то вроде этого

C++
1
2
3
4
char s[100];
cin >> s;
char *p = strchr(s, '.');
int Kz = strlen(p) - 1;

Конечно, для полного тахащусса надо добавить некоторые проверки. Но суть в том, что нам дается представление числа, вот с ним и надо работать. И это – просто.



1



Комп_Оратор)

Эксперт по математике/физике

8846 / 4588 / 619

Регистрация: 04.12.2011

Сообщений: 13,692

Записей в блоге: 16

25.08.2019, 00:06

17

Цитата
Сообщение от Байт
Посмотреть сообщение

Конечно, для полного тахащусса надо добавить некоторые проверки.

Да. Это точно. Вот допустим число выглядит так: 1.05808786500000e-305
То есть, я бы десятичный логарифм взял. Потом получил чистую мантиссу: 1.05808786500000. А потом уже проанализировал и отбросил 5 последних нулей: 1.058087865 и затем уже вернул порядок на место 1.058087865e-305.
Ведь речь то может идти только о строковом десятичном представлении (моё предположение). Внутренне представление останется двоичным, а десятичное, числовое, всё едино будет дополнено нулями справа до 15 или 16 общих штук.



1



Диссидент

Эксперт C

27465 / 17154 / 3780

Регистрация: 24.12.2010

Сообщений: 38,636

25.08.2019, 00:27

18

Цитата
Сообщение от IGPIGP
Посмотреть сообщение

Ведь речь то может идти только о строковом десятичном представлении (моё предположение)

Золотые слова ваши! Но только эти. Имхо, все остальное к делу никакого касательства не имеют. И нули вы зря отбрасываете. Зачем? Ваше число имеет 305+15 = 320 знаков после запятой (если я не ошибся,, считая ваши циферки)
Мы анализируем только написанное, и нам плевать на то, что делает с этим комп, как он там разбирается с числом. Наше дело – строка. И более ничего.

Добавлено через 5 минут
IGPIGP, Понимаете, если написано 1.00000, то тут именно 5 знаков после запятой. И “в быту” это говорит о том, что измерения произведены именно с этой точностью.



1



Комп_Оратор)

Эксперт по математике/физике

8846 / 4588 / 619

Регистрация: 04.12.2011

Сообщений: 13,692

Записей в блоге: 16

25.08.2019, 01:21

19

Цитата
Сообщение от Байт
Посмотреть сообщение

если написано 1.00000, то тут именно 5 знаков

Это как раз я и сказал там, где вы увидели золотые слова. То есть, смысл вопроса:

Цитата
Сообщение от Kolter
Посмотреть сообщение

Подскажите, пожалуйста, как посчитать кол-во цифр после запятой?

может присутствовать лишь если речь идёт о значащих цифрах. Последняя группа нулей к ним не относится и может быть отброшена. Это имеет смысл только в строковом представлении.
А в компьютерном, даже ноль имеет 14(или 15?) знаков после запятой в мантиссе. И все нули, да. Это не удивительно. Ибо на этом зиждется храм бытия.



0



Комп_Оратор)

Эксперт по математике/физике

8846 / 4588 / 619

Регистрация: 04.12.2011

Сообщений: 13,692

Записей в блоге: 16

25.08.2019, 08:19

20

И ещё. Вот это

Цитата
Сообщение от Байт
Посмотреть сообщение

Мы анализируем только написанное, и нам плевать на то, что делает с этим комп

преувеличение. Программирование и математика порождают разные абстракции на одной и той же словарной (терминологической) базе. Тут важно, что имеет в виду человек, задающий тему. У ТС

Цитата
Сообщение от Kolter
Посмотреть сообщение

В программе присутствуют как все число n=5.4569,так и дробная часть

То есть, речь о типе данных с плавающей точкой (мы не знаем float или double или long double – вот это таки плохо) но не о числах с математической точки зрения. Мат-абстракция числа не имеет конечного представления в общем случае, не выражаемого функционально. Число Пи легко можно выразить как отношение длины окружности к диаметру, например. На этом легкость и заканчивается.



0



Вы можете использовать регулярное выражение для синтаксического анализа value, записи десятичных цифр и подсчета длины совпадения, если таковые имеются:

import re

def num_decimal_places(value):
    m = re.match(r"^[0-9]*.([1-9]([0-9]*[1-9])?)0*$", value)
    return len(m.group(1)) if m is not None else 0

это немного меньше “сырых”, чем разделение строки с помощью нескольких if else, но не уверен, что они более простые или более читаемые.

Stefano Sanfilippo
26 фев. 2015, в 19:36

Поделиться

Вам не нужно регулярное выражение, вы можете конвертировать в float и конвертировать обратно в строку! это автоматически удалит нули:

>>> def convertor(s):
...       try :
...          int(s.rstrip('0').rstrip('.'))
...          return 0
...       except: 
...          return len(str(float(s)).split('.')[-1])
... 
>>> convertor('4.0230')
3
>>> convertor('4.0')
0
>>> convertor('4')
0

Kasramvd
26 фев. 2015, в 19:52

Поделиться

вы также можете просто попробовать что-то вроде:

try:
    return len(str(num).split('.')[1].rstrip('0'))
except
    return 0

acushner
26 фев. 2015, в 19:21

Поделиться

Самый лучший и самый Pythonic способ достичь этого:

import decimal
x = '56.001000'
x = x.rstrip('0')  # returns '56.001'
x = decimal.Decimal(x)  # returns Decimal('0.001')
x = x.as_tuple().exponent  # returns -3
x = abs(x)  #returns 3

Выше код можно записать проще:

>>> x = '56.001000'
>>> abs(decimal.Decimal(x.rstrip('0')).as_tuple().exponent)
3

Ниже приведен список используемых функций для дополнительной справки:

  • str.rstrip(): вернуть копию строки с удаляемыми концевыми символами.
  • decimal.Decimal(): создать новый десятичный объект, основанный на значении.
  • x.as_tuple(): возвращает namedtuple в формате: DecimalTuple (знак = 0, цифры = (1,), показатель = -3)
  • abs(): вернуть абсолютное значение числа.

Moinuddin Quadri
26 фев. 2015, в 19:55

Поделиться

import re

def f(s):
    ls = s.split('.', 1)
    if len(ls) == 2 and re.match(r'd*$', ls[1]):
        return len(ls[1].rstrip('0'))
    return 0

assert f('12') == 0
assert f('12.') == 0
assert f('12.1') == 1
assert f('12.100006') == 6
assert f('12.1.3') == 0
assert f('12.1abc') == 0
assert f('12.100000') == 1

ferhat elmas
26 фев. 2015, в 19:47

Поделиться

Строковым процессом:

  • Проверить . присутствует в числовой строке или нет.
  • Если нет, то верните 0.
  • Если присутствует строка с разделительным номером на . и получить второй элемент из результата split.
  • Удалите 0 с правой стороны.
  • Возврат len элемента.

код:

>>> def dCount(no_str):
...    if "." in no_str:
...         return len(no_str.split(".")[1].rstrip("0"))
...    else:
...         return 0
... 
>>> dCount("2")
0
>>> dCount("2.002")
3
>>> dCount("2.1230")
3
>>> dCount("2.01230")
4
>>> 

Vivek Sable
26 фев. 2015, в 18:16

Поделиться

Вы можете попробовать использовать функцию Decimal в python:

abs(Decimal(string_value).as_tuple().exponent)

как объяснено в
Легкий способ поиска десятичных знаков

Pedro Braz
26 фев. 2015, в 19:29

Поделиться

Ещё вопросы

  • 0Объект, два выпадающих списка, ng-options и привязка значения
  • 0некоторые персонажи ведут себя необычно в функции htmlentities
  • 1SQLAlchemy ResultProxy загружать строки по требованию?
  • 0vector.push_back () intellisense error
  • 1объект цепочки исключений в JAVA
  • 0Google войти с помощью angularjs
  • 0Код Jquery для разделения ссылки href
  • 0Как обрабатывать промахи в функции get (key) C ++ HashMap?
  • 0Угловая лучшая практика. Действия контроллера, запускающие анимацию
  • 0Функция события клика не запускается из лайтбокса Fancybox
  • 0C3P0 один сервер несколько баз данных
  • 1C # .NET 4.0 Перетаскивание между двумя приложениями
  • 1Eclipse IDE ошибка компиляции
  • 1Невозможно отобразить два элемента в пользовательском представлении
  • 0REGEX PHP Строка в JSON Вывод
  • 1Сохранение стилей при замене слов в python-docx
  • 0jQuery: не (: проверено) не работает?
  • 0Возвращаемые значения в редактируемой таблице Datatables – самые последние изменения для всех отредактированных элементов.
  • 0JQuery, div отображается, но не исчезает
  • 1Определить предмет, объект, глагол в английском предложении?
  • 0Как установить объект файла как ngModel, используя $ setViewValue (file)
  • 0Как создать ссылки с использованием JSON, которые при нажатии отображаются в отдельном элементе <div>?
  • 1Рассчитать RA DEC / AZ EL точек Лагранжа, видимых с места на земле
  • 1Эрланг считает, что возраст?
  • 0Twiiter Follow Button For Newsletter / Html email
  • 0Читайте информацию о компоновщике из dll [дубликата]
  • 1Возобновление асинхронного чтения с использованием Rx?
  • 0Google Places хранит результаты в Mysql с PHP
  • 1Получение метаданных сущности с помощью веб-API
  • 0Проблема CSS – что вызывает эту вертикальную линию?
  • 1Не удается получить электронную почту пользователя с интеграцией Facebook
  • 1Как изменить легенду Matplotlib
  • 0Как показать изображение и контент из базы данных на страницу PHP?
  • 0Указатель на имя пользователя
  • 1Датагрид привязка МВВМ
  • 0Побитовое «не» нуля равно нулю, когда ноль рассчитывается сдвигами
  • 0codeigniter извлекает таблицу mysql с where_in + сохраняет порядок массива ключей в массиве результатов
  • 0Добавление URL сайта в заголовок сайта
  • 0PHP-SQL Подготовленные операторы с переменным числовым именем таблицы [дубликаты]
  • 0Выбор элемента из многомерного массива
  • 1Отслеживание и очистка истории активности Android
  • 0Невозможно получить доступ к элементу из класса сортировки c ++
  • 0Как я могу сказать Visual Studio, чтобы связать библиотеку с моим проектом?
  • 0Angular Template Cache – Очистить кэш для обновленного шаблона
  • 1React router добавляет страницу наконец при маршрутизации
  • 1Невозможно добавить изображение к кнопке с помощью getResource () (получить NullPointerException – создание проекта с помощью муравья)
  • 1Попросите пользователя продолжить просмотр следующих 5 строк данных
  • 0Как включить отображение Jquery Mobile – карты Google только при нажатии кнопки
  • 1Кнопка onClick не привязана к методу в Activity
  • 1Каков наилучший способ проверки правильных dtypes в кадре данных pandas в рамках тестирования?

f f



Ученик

(64),
закрыт



5 лет назад

Олег Олегович

Просветленный

(22336)


5 лет назад

//double d = 100;
double d = 100.123456789012;
int i = 0;
while (d * Math.Pow(10, 1 + i) % 10 != 0) { i++; }
Console.WriteLine(“У числа {0} {1} знаков после запятой.”, d, i–);

f fУченик (64)

5 лет назад

“У числа 1,569975 7 знаков после запятой.”
Эх, близко, но не то. Там алгоритм сложнее…

f f
Ученик
(64)
Можно, конечно, с округлением поиграть, но это тоже как-нибудь да сломает программу

Алекс Куха

Высший разум

(427016)


5 лет назад

Число значащих цифр для каждого типа известно заранее. (7/15)

f fУченик (64)

5 лет назад

Я имею ввиду следующее:
Пользователь ввел число 123,4985
Надо вывести 4 (потому что 4985)

Алекс Куха
Высший разум
(427016)
не факт. Введённое число необязательно будет равно хранимому в памяти

Sergey

Гуру

(2682)


5 лет назад

число дабл содержит 52+1 бит в мантиссе. Это соответствует ~15 десятичным знакам.
Если число цифр после запятой это, число значимых знаков после запятой в виде ХХХХ. YYYY, то это 15 – log10(число).

Сергей Куксенков

Просветленный

(41944)


5 лет назад

double number = 129.12563;

int count = BitConverter.GetBytes(decimal.GetBits((decimal)number)[3])[2];

Console.WriteLine(count); // 5

Как это работает тут: matthewedmondson . info / 2014 / 03 / reliance-on-implementation-details . html

 
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 – ты думаешь за нас”…


Добавить комментарий