Тема: "усовершенствование" itoa и rtos

может пригодиться любителям астрономии :)

(vl-load-com)

хорошая вещь - vlax-make-variant

(defun vk_ItoA (Int)
  (vlax-variant-value (vlax-make-variant (fix Int) vlax-vbString))
)

больше чем (vk_ItoA 999999999999999) получить не удается
для сравнения максимум (itoa 2147483647)

(defun vk_RtoS    (InReal Precision / Frac FracInt FracPow Int Minus)
  (if (minusp InReal)
    (setq InReal (abs InReal)
      Minus     t
    )
  )
  (setq    Int    (fix InReal)
    Frac    (- InReal Int -1)
    FracPow    (* Frac (expt 10. Precision))
    FracInt    (fix FracPow)
  )
  (if (>= (- FracPow FracInt) 0.5)
    (setq FracInt (1+ FracInt))
  )
  (strcat (if Minus
        "-"
        ""
      )
      (if (zerop Precision)
        (vk_ItoA (+ Int FracInt -1))
        (strcat (vk_ItoA Int) "." (substr (vk_ItoA FracInt) 2))
      )
  )
)

больше чем (vk_RtoS 999999999999999 14) получить не удется
для сравнения максимум (RtoS 999999999999999 2 0)

Re: "усовершенствование" itoa и rtos

(setq a 1.12345678901234567890)
(rtos a 2 15) ;_"1.123456789012346"
(vk_RtoS a 15);_"1.,12345678901235E+15" 

vk_ItoA возвращает большие числа с разделителем целой и дробной части , (может зависит от системных настроек)

(vk_ItoA 12345678901234567890);"1,23456789012346E+19"  

Re: "усовершенствование" itoa и rtos

> VVA
я указал ограничения для функций.
по сути все это писАлось только ради того, что бы не использовать RTOS.
но хуже всего то, то при таких больших чиcлах не очень корректно работает FIX. наверно это предел точности автокада, что ли...
(RtoS (+ 9999999999999 0.6481) 2 10);"9999999999999.650"
(vk_RtoS (+ 9999999999999 0.6481) 10);"9999999999999.6484375000"

Re: "усовершенствование" itoa и rtos

ПО моим наблюдения предел точк=ности rtos 15 знаков

(setq a 0.123456789012345678901234567890)
(rtos a 2 14) ;_"0.12345678901235"
(rtos a 2 15) ;"0.123456789012346"
(rtos a 2 16) ;"0.1234567890123457"
(rtos a 2 17) ;"0.1234567890123456"
(rtos a 2 18) ;"0.1234567890123456"

Более того, с подачи Евгения Елпанова, анализируя Express'овские ф-ции, возвращающие точность, видно, что с повышение разрядности у запрашиваемых чисел (1 10 100), уменьшается разрядность возвращаемой точности(-016 -015 -014). Наверное 16 знаков на все, а не только после запятой

(ACET-GEOM-POINT-FUZ '(1 0 0)) ;_4.57757e-016
(ACET-GEOM-POINT-FUZ '(10 0 0)) ;_3.55271e-015
(ACET-GEOM-POINT-FUZ '(100 0 0)) ;_5.85929e-014

Re: "усовершенствование" itoa и rtos

VVA пишет:

Наверное 16 знаков на все, а не только после запятой

Именно так. При использовании double точность не может превышать 16 знаков. А с учетом ошибок округления - больше чем на 14-15 знаков ориентироваться не стоит.

Re: "усовершенствование" itoa и rtos

наконец то я понял что значит floating point, тоесть точка только плавает туда-сюда, а длина остается стабильной :)

> VVA
длина в 16 знаков это не столько ограничение RTOS, сколько ограничение лиспаa и автокада :(

(rtos (- (+ 9999999999999. 0.12345) 9999999999999.) 2 4)
(rtos (- (+ 99999999999999. 0.12345) 99999999999999.) 2 4)
(rtos (- (+ 999999999999999. 0.12345) 999999999999999.) 2 4)
(rtos (- (+ 9999999999999999. 0.12345) 9999999999999999.) 2 4)

Re: "усовершенствование" itoa и rtos

на  сколько я помню... гдето тут читал. Что у автокада и соответсвенно, lispa, точность гораздо больше этих 16 знаков, просто он не выводит на экран больше 16 знаков. а учитывает он все таки гораздо больше знаков...
Command: (rtos 0.12345123312312315 2 20)
"0.1234512331231231"
Command: (rtos (* 2 0.12345123312312315) 2 20)
"0.2469024662462462"

Re: "усовершенствование" itoa и rtos

(setvar 'LUPREC 4)
(setvar 'CMDECHO 0)
(command "._POINT" "1.2345,1.2345")
(command "._LIST" (entlast) "")
(command "._MOVE" (entlast) "" "0.0,0.0" "@100<90")
(command "._MOVE" (entlast) "" "0.0,0.0" "@100<0")
(command "._LIST" (entlast) "")
(command "._MOVE" (entlast) "" "0.0,0.0" "@100<180")
(command "._MOVE" (entlast) "" "0.0,0.0" "@100<270")
(command "._LIST" (entlast) "")
(command "._MOVE" (entlast) "" "0.0,0.0" "@999999999999999<90")
(command "._MOVE" (entlast) "" "0.0,0.0" "@999999999999999<0")
(command "._LIST" (entlast) "")
(command "._MOVE" (entlast) "" "0.0,0.0" "@999999999999999<180")
(command "._MOVE" (entlast) "" "0.0,0.0" "@999999999999999<270")
(command "._LIST" (entlast) "")