Safe addition: Difference between revisions

Content added Content deleted
Line 289: Line 289:
size inf
size inf
</pre>
</pre>

=={{header|C++}}==
{{trans|C#}}
<lang cpp>#include <iostream>
#include <tuple>

union conv {
int i;
float f;
};

float nextUp(float d) {
if (isnan(d) || d == -INFINITY || d == INFINITY) return d;
if (d == 0.0) return FLT_EPSILON;

conv c;
c.f = d;
c.i++;

return c.f;
}

float nextDown(float d) {
if (isnan(d) || d == -INFINITY || d == INFINITY) return d;
if (d == 0.0) return -FLT_EPSILON;

conv c;
c.f = d;
c.i--;

return c.f;
}

auto safeAdd(float a, float b) {
return std::make_tuple(nextDown(a + b), nextUp(a + b));
}

int main() {
float a = 1.20f;
float b = 0.03f;

auto result = safeAdd(a, b);
printf("(%f + %f) is in the range (%0.16f, %0.16f)\n", a, b, std::get<0>(result), std::get<1>(result));

return 0;
}</lang>
{{out}}
<pre>(1.200000 + 0.030000) is in the range (1.2299998998641968, 1.2300001382827759)</pre>


=={{header|C#|C sharp}}==
=={{header|C#|C sharp}}==