For Development HEAD DRAFTSearch (procedure/syntax/module):

12.4 compat.norational - Rational-less arithmetic

Module: compat.norational

Until release 0.8.7, Gauche didn’t have exact rational numbers. It was able to read the rational number literals such as 2/3, but they are immediately coerced to inexact real numbers (except when it represents a whole integer). And if you divided an exact integer by another exact integer, the result could be coerced to an inexact real if the result wasn’t a whole integer.

As of 0.8.8, this is not the case anymore. Exact division always yields exact result, except when the divisor is zero.

(/ 2 3)  ⇒ 2/3
(/ 5)    ⇒ 1/5
(/ 4 2)  ⇒ 2

This is more precise, but has one drawback: exact rational arithmetic is much slower than the integer and inexact real arithmetic. If you inadvertently produce a rational number in the early stage of calculation, and continue to apply exact arithmetic, performance would be degraded miserably.

The proper way to solve this is to insert exact->inexact to appropriate places. However, to ease the transition, you can just import this module and the division / behaves in the way it used to.

(use compat.norational)

(/ 2 3)  ⇒ 0.6666666666666666
(/ 5)    ⇒ 0.2
(/ 4 2)  ⇒ 2

The effect is not global, but only to the modules you explicitly import compat.norational.

This module only redefines /. So if your code has exact rational literals, they are treated as exact rationals rather than coerced to inexact reals. You should prefix rational literals with #i to force Gauche to coerce them to inexact reals:

gosh> 1/3
1/3
gosh> #i1/3
0.3333333333333333


For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT