2010-07-21 2 views
2

это будет сложный вопрос, я связался с автором, но до сих пор нет ответов я не дам ему выстрелили здесь: В пакете RCL (http://common-lisp.net/project/rcl/) примеры:Пакет RCL и Inf

(in-package :rcl) 
(r-init) 

(r "/" 1 5) 
RCL> 0.2d0 

(r "print" (r% "/" 1 5)) 
RCL> ;R# [1] 0.2 
0.2d0 

выше нормально, но

(r "/" 1 0) 
RCL>> #<a FLOATING-POINT-OVERFLOW> 

сломанной

(r "print" (r% "/" 1 0)) 
RCL>> ;R# [1] Inf 
#<a FLOATING-POINT-OVERFLOW> 

сломаны

или (r "log" 0)

Как обойти это так, что, когда R попадает в инф значения моя Лисп не ломается, а просто дает сообщение, что вычисленный инф значение; Вышеприведенный пример - простой пример, но есть моменты, когда мы имеем во время деления статистических процедур на ноль, которые тем не менее не делают недействительными результаты, а R возвращает окончательное значение (например, во время оптимизации), но это, к сожалению, сбой при использовании RCL.

+1

Ссылка на RCL? – Shane

ответ

3

Хорошо, я получил ответ от автора, который я размещаю здесь: Поддержка бесконечных чисел с плавающей запятой IEEE зависит от платформы. Следующие лепечет работают, по крайней мере, в этой системе (MacOSX):

SBCL

R> (r "/" 1 0) 
.SB-EXT:DOUBLE-FLOAT-POSITIVE-INFINITY 
R> (r "log" 0) 
.SB-EXT:DOUBLE-FLOAT-NEGATIVE-INFINITY 

Allegro CL

R> (r "/" 1 0) 
.EXCL:*INFINITY-DOUBLE* 
R> (r "log" 0) 
.EXCL:*NEGATIVE-INFINITY-DOUBLE* 

LispWorks

R> (r "/" 1 0) 
+1D++0 #| +1D++0 is double-float plus-infinity 
R> (r "log" 0) 
-1D++0 #| -1D++0 is double-float minus-infinity 

CMUCL не делает (X86: SIGFPE-HANDLER, без исключений), но я думаю, что это можно исправить (http://common-lisp.net/project/cmucl/doc/cmu-user/extensions.html#float-traps).

ECL Последнее, что я пробовал, и это, по-видимому, тот, который вы используете (у меня такое же исключение FLOATING-POINT-OVERFLOW). Кажется, что он также позволяет отключить переполнение проверки с использованием SI:TRAP-FPE, это может быть то, что вам нужно (следующий пример взят из http://www.lispforum.com/viewtopic.php?f=2&t=386):

(let* ((bits (si::trap-fpe 'last nil))) 
    (prog1 (/ 1.0 0.0) 
    (si::trap-fpe bits t))) 
.SI:SINGLE-FLOAT-POSITIVE-INFINITY 

Кроме того, это работает в общем:

(handler-case (r "/" 2 0) 
    (floating-point-overflow() nil)) 
+1

Также это работает в целом: (handler-case (r "/" 2 0) \t (с плавающей точкой переполнения() nil)) – francogrex

Смежные вопросы