[Openmcl-devel] roundings...

Joakim Sandgren joakim at joakimsandgren.com
Sat Sep 8 16:01:46 PDT 2012


so also c round to the nearest even?
j
Le 9 sept. 2012 à 00:49, Gary Byers <gb at clozure.com> a écrit :

> The fact that some cases of ROUND in CCL depend on the rounding mode of the
> FPU being set to its default value doesn't mean that it's a good idea to change
> the rounding mode in order to get ROUND to produce incorrect results ...
> 
> I'd also misremembered that C defaults to a rounding-mode other than :nearest.
> 
> Not a good message at all, I'm afraid.
> 
> 
> On Sat, 8 Sep 2012, Joakim Sandgren wrote:
> 
>> interesting!
>> what I understand is that the :zero mode then equals to floor...?
>> and that :negative mode does the same (?)
>> and that the :positive mode equals to ceiling.?
>> 
>> one could have a mode that rounds upwards from .5...
>> 
>> joakim
>> 
>> Le 8 sept. 2012 ?22:02, Gary Byers <gb at clozure.com> a ?rit :
>> 
>>> I'd parsed the original question as asking how to change the rounding
>>> mode used by the hardware, in which case section 4.11 of the CCL manual
>>> would be suggested reading.
>>> 
>>> CCL defaults to using "round to nearest [even number]" and IIRC C defaults
>>> to "round towards 0", so things like (ROUND 1.5) will yield different results than the C equivalent.
>>> 
>>> ? (get-fpu-mode :rounding-mode)
>>> :NEAREST
>>> ? (round 1.5)
>>> 2
>>> -0.5
>>> ? (set-fpu-mode :rounding-mode :zero)
>>> 14592
>>> ? (round 1.5)
>>> 1
>>> 0.5
>>> ?
>>> 
>>> 
>>> On Fri, 7 Sep 2012, Bill St. Clair wrote:
>>> 
>>>> Joakim,
>>>> 
>>>> Please send an example of a .5 case that doesn't round to the even number.
>>>> 
>>>> Your example is running into the limit of resolution of single floats.
>>>> 5.4999999 IS 5.5, so it rounds to 6:
>>>> 
>>>> CL-USER> 5.4999999
>>>> 5.5
>>>> CL-USER> (round *)
>>>> 6
>>>> -0.5
>>>> CL-USER> (= 5.4999999 (+ 5 1/2))
>>>> T
>>>> CL-USER> 5.4999999d0
>>>> 5.4999999D0
>>>> CL-USER> (round *)
>>>> 5
>>>> 0.4999998999999997D0
>>>> 
>>>> Note the rounding error in the final result. Almost, but not quite
>>>> 0.4999999 . So it is with floats. If you need precise math, use
>>>> RATIONALs (INTEGERs and RATIOs).
>>>> 
>>>> If your C code works differently, are you sure you're using single
>>>> floats there? May I see it?
>>>> 
>>>> -Bill
>>>> 
>>>> On Fri, Sep 7, 2012 at 4:30 AM, Joakim Sandgren
>>>> <joakim at joakimsandgren.com> wrote:
>>>>> Hi,
>>>>> 
>>>>> how can I do a more 'c-like' rounding in lisp ?
>>>>> that is in the .5 cases not always go to the even number.
>>>>> i would like to have it to round up
>>>>> and perhaps have better float resolution ? in lisp: (round 5.499999) => 5 (round 5.4999999) => 6
>>>>> 
>>>>> 
>>>>> 
>>>>> are there some way around this?
>>>>> 
>>>>> sincerely
>>>>> joakim
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> Openmcl-devel mailing list
>>>>> Openmcl-devel at clozure.com
>>>>> http://clozure.com/mailman/listinfo/openmcl-devel
>>>> _______________________________________________
>>>> Openmcl-devel mailing list
>>>> Openmcl-devel at clozure.com
>>>> http://clozure.com/mailman/listinfo/openmcl-devel
>>>> 
>>>> 
>>> 
>> 
>> 
> 




More information about the Openmcl-devel mailing list