| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
В общем случае никак ты это не сделаешь. Проблема в том что комп хранит вещественные числа как мантису и показатель экспоненты. То есть в виде который тебе выдается при простом write, вот так: 1.123е+2 (храниться число 1.123 и число 2). После запятой бесконечное число знаков, точнее не бесконечное, а определяемое числом бит выделенных под хранение твоей вещественной переменной. Если ты хочешь проверять число знаков после запятой у заданной тобой константы, то ты еще может и выкрутишся как-то. А если нужно получить число знаков после запятой у результата каких-то вычислений, то можно нарваться на неприятность, потому как даже результат деления 5/2 может храниться как 2.499999999999. И это не глюк - это особенность работы с вещественными числами. Я конечно немного утрирую и для специальных случаев можно попробовать делать так как советует Vit - но не удивляйся если в некоторых случаях работать не будет. |
| Автор: Chingachguk 23.4.2002, 02:50 |
| А что мешает читать мантиссу ? Формат-то известен ... |
| Автор: remax 23.4.2002, 12:09 | ||
Для этого можно использовать форматный перевод в строку, например 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
Примечание (мое) 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 | ||
Ты немного не понял, я говорю про кубический корень из отриц. числа, а на сколько я знаю, 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| Ну и так далее ... |