Safe addition: Difference between revisions
Content deleted Content added
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> |
||