Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Questions


Автор: Mikel 22.4.2002, 14:15
1) Нужна функция, возращающая кол-во значимых знаков после точки
Пример:
x=1.567345673 result=9
x=1432.45 result=2
x=243.2354 result=4

2) Как создать новый Series:TChartSeries для Chart1:TChart, со свойствами уже имеющегося Series'а.
3) При куче zoom'ов для Chart'а всплывает ошибка. Как от неё избавиться?

Автор: Vit 22.4.2002, 14:21
Разделил бы ты вопросы...

1) Перевести в строку и найти позицию точки с конца...
2) А там свойства Assign случайно нет? Если нет - то только присвоением свойств...
3) Не знаю, скорее всего попробовать другой компонент.

Автор: Mikel 22.4.2002, 14:28
В строку он переводит в стандартно виде- типа 1.123е+2 и долго.

Автор: Vit 22.4.2002, 16:06
Умножай в цикле на 10 и проверяй осталась ли дробная часть (Frac) большая нуля или нет.

Автор: Nloge 23.4.2002, 02:37
Цитата

Нужна функция, возращающая кол-во значимых знаков после точки
Пример:
x=1.567345673 result=9
x=1432.45 result=2
x=243.2354 result=4

В общем случае никак ты это не сделаешь. Проблема в том что комп хранит вещественные числа как мантису и показатель экспоненты. То есть в виде который тебе выдается при простом write, вот так: 1.123е+2 (храниться число 1.123 и число 2). После запятой бесконечное число знаков, точнее не бесконечное, а определяемое числом бит выделенных под хранение твоей вещественной переменной. Если ты хочешь проверять число знаков после запятой у заданной тобой константы, то ты еще может и выкрутишся как-то. А если нужно получить число знаков после запятой у результата каких-то вычислений, то можно нарваться на неприятность, потому как даже результат деления 5/2 может храниться как 2.499999999999. И это не глюк - это особенность работы с вещественными числами.
Я конечно немного утрирую и для специальных случаев можно попробовать делать так как советует Vit - но не удивляйся если в некоторых случаях работать не будет.

Автор: Chingachguk 23.4.2002, 02:50
А что мешает читать мантиссу ? Формат-то известен ...

Автор: remax 23.4.2002, 12:09
Цитата(Mikel @ 22.4.2002, 15:28)
В строку он переводит в стандартно виде- типа 1.123е+2 и долго.

Для этого можно использовать форматный перевод в строку, например FloatToStrF(переменная,fffixed,знаков, после запятой). Может с другими опциями, не помню какие есть еще. Но это скучно.

Автор: Mikel 24.4.2002, 07:14
Кстати, у меня ещё были проблемы с тпиом double, когда теоритически в ней хранится, например, число 10, то при сравнении с 10 он пишет что они не равны-на последних байтах тварится какая-то фигня(ошибка исправляется,если число умножить и поделить на 10000000 или ещё какое-нть большое число)

Автор: remax 24.4.2002, 10:15
Так и должно быть (смотри сообщение Nloge). А насчет такого принудительного округления - так это как раз используется принцип клин-клином. А называется это - ошибка усечения, т.е. при умножении двух чисел с ограниченной разрядностью происходит потеря младших разрядов. Для уменьшения влияния этого вида ошибки существует целая система правил - в каком порядке предпочтительней организовывать вычисления...

Автор: remax 24.4.2002, 20:06
Для обсуждения проблем, связанными с ошибками я запустил новую тему в разделе Технологии и Алгоритмы: http://www.forum.vingrad.ru/cgi-bin/newforum/ikonboard.cgi?act=ST;f=13;t=643

Автор: neutrino 25.4.2002, 10:04
Цитата

А что мешает читать мантиссу ? Формат-то известен ...


Я знаю формат числа с плаваюшей точкой (и двойной точности). Но кто подскажет, как число, например float как бы разбить на все 3 части. Я имею ввиду на знак, степень и мантиссу?

Автор: Chingachguk 25.4.2002, 12:08
Это из конференции RTFM ;)

Цитата


Не как не могу осмыслить алгоритм перевода, хотя бы даже просто в
десятичное, т.е. имеем одинарной точности FP по стандарту IEEE
 [s][30..Q..23][22.M..0]
по формуле все понятно и вопросов не вызывает
 (S)*(2^[q-127])*M   в общем случае,

для числа 3.5 имеем
     dd 40600000h

              +---------- M -------------+
              |                          |
    30        |                          |
   0100|0000 0110|0000 0000|0000 0000|0000
   ||        |
 S-+|        |
    |        |
    +-- Q ---+

   Вот по всякому кручусь а 3.5 не получается ;-)
   Помогите хотя бы понять последовательность действий.



Примечание (мое) dd 40600000h - Это шестнадцетиричная запись real-числа из 4 -х байт (в паскале - real).

Автор: Mikel 25.4.2002, 15:16
И ещё
power(-1,1/3)-не вычисляется, мне так кажется потому что 1/3=0.(3), или в переменной 0.33333333333333333333333=33333333333333333333333/(10^23) =>x^(1/3)=корень 10^23 степени из числа x^33333333333333333333333. Как от этого избавиться?

Автор: Chingachguk 25.4.2002, 15:39
Попробуй:

power(a,b) == exp(b*ln(a))

;)

Автор: Mikel 25.4.2002, 18:29
Цитата(Chingachguk @ 25.4.2002, 16:39)
Попробуй:

power(a,b) == exp(b*ln(a))

;)

Ты немного не понял, я говорю про кубический корень из отриц. числа, а на сколько я знаю, ln не существует для отриц. чисел, если я не прав, исправьте.

Автор: Chingachguk 25.4.2002, 18:42
(-5)^x = (-1)^x * 5^x;

(-1)^(1/2) = i (мнимая единица - ТФКП);

(-1)^x = i^(2*x);

x^y = (sign(x))^y * exp(y*ln(|x|;));

Ну и так далее ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)