Safe addition: Difference between revisions

Content deleted Content added
Nbdsp (talk | contribs)
Cc (talk | contribs)
Added Hare
Line 498: Line 498:
<pre>
<pre>
1.2 0.03 {1.2299999999999998 1.2300000000000002}
1.2 0.03 {1.2299999999999998 1.2300000000000002}
</pre>

=={{header|Hare}}==
{{trans|C}}
<lang hare>use fmt;
use math;

type interval = struct {a: f64, b: f64};

export fn main() void = {
const a: [_](f64, f64) = [
(1.0f64, 2.0f64),
(0.1f64, 0.2f64),
(1e100f64, 1e-100f64),
(1e308f64, 1e308f64)];

for (let i = 0z; i < len(a); i += 1) {
let res = safe_add(a[i].0, a[i].1);
fmt::printfln("{} + {} is within ({}, {})", a[i].0, a[i].1, res.a, res.b)!;
};
};

fn safe_add(a: f64, b: f64) interval = {
let orig = math::getround();
math::setround(math::fround::DOWNWARD);
let r0 = a + b;
math::setround(math::fround::UPWARD);
let r1 = a + b;
math::setround(orig);
return interval{a = r0, b = r1};
};</lang>
{{out}}
<pre>
1 + 2 is within (3, 3)
0.1 + 0.2 is within (0.3, 0.30000000000000004)
1e100 + 1e-100 is within (1e100, 1.0000000000000002e100)
1e308 + 1e308 is within (1.7976931348623157e308, Infinity)
</pre>
</pre>