|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Попытка победить floating-point
Регистрация: 17.01.2014
Сообщений: 100
|
||
Просмотров: 552
|
|
||||
Moderator
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,490
|
Ты пост-то смотрел прежде чем отправить? )) Глаза же сломать можно )
Глянь https://autolisp.ru/2021/05/19/chto-...-te-rezultaty/ - это к вопросу об использовании rtos. И я б не сильно доверял любому из вариантов. Потому как то же самое умножение на 10 вполне может увеличивать ошибку. Казалось бы, простейший код типа Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 08.08.2019
Сообщений: 22
|
Почему же 3 вариант - костыль? Число все равно в памяти хранится как двоичное: 1 бит для знака, 11 бит для экспоненты и 52 бита для мантиссы. Так что для самой машины десятичное число это уже костыль, существующий для удобства представления пользователю.
А вычитание типов double - вообще отдельная тема https://ru.stackoverflow.com/questions/1073688 |
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 100
|
Цитата:
![]() Цитата:
Цитата:
Думаю, классическим подходом к решению подобной задачи, было бы оперирование остатком деления числа. А тут, получается, мы конвертируем числовой тип в строковый, чтобы найти где в строке расположена точка. Но может, и правда, такой подход тоже имеет смысл. И то, что я рассматриваю подобный вариант, как костыль, это мои тараканы в голове. ![]() |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,509
|
оформите в виде отдельной функции, потом уже в готовой программе на реальных наборах данных можете экспериментировать с производительностью/используемыми ресурсами. Внутри лисповских строковых функций скорее всего быстрые сишные функции вызываются, поэтому спорный вопрос по производительности - реализация циклов на лиспе или вызов пару строковых функций лиспа.
|
|||
![]() |
|
||||
Регистрация: 17.01.2014
Сообщений: 100
|
Как я писал выше, если передаваемое, в качестве аргумента, число - это integer, либо real с нулевой дробной частью, функция возвращает 0, в противном случае - количество знаков после точки.
В случае бесконечных десятичных дробей, вроде числа pi, возвращаемый результат функции, думаю, должен быть в диапазоне от 15 до 17. То есть по стандарту IEEE 754, в соответствии с которым, числа двойной точности хранятся в памяти AutoCAD. В этом отношении, показательным примером будет функция под номером 2 из первого поста темы: Код:
(DecimalPlaceNum (/ 1.0 3)) вернет 17 Впрочем, вполне возможно, было бы ограничиться числом 15, как фиксированной величиной. Более высокая точность, наверное, мало где применима в рамках CAD. Но в связи с тем, что начиная именно с 15-го разряда и выше "зашумление погрешностью" становится наиболее выраженно, приходится ограничиваться 14-тью значащими десятичными цифрами, что приводит к третьему варианту функции из первого поста: (rtos num 2 14) - это вынужденный подход, за неимением иных вариантов решения задачи. Да, думаю, так и сделаю. Последний раз редактировалось Browning Zed, 14.10.2025 в 18:40. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Point Name, 3D offset и др. в Autodesk Land Desktop 2007 | Re-Maker | Вертикальные решения на базе AutoCAD | 2 | 12.08.2014 10:19 |
C#.NET. Переопределение ручек (Grip Overrule). | Do$ | .NET | 7 | 20.05.2013 15:22 |
AutoCAD2010 выдает 82 отчета об ошибке за раз | Nusia | AutoCAD | 22 | 29.08.2012 16:11 |
Не работает Temporary Track Point | Stelth | AutoCAD | 2 | 25.01.2011 15:09 |
Regen | Holon | Программирование | 28 | 03.08.2007 15:18 |