File: rounding_modes_simple.cpp

package info (click to toggle)
cgal 6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 144,912 kB
  • sloc: cpp: 810,858; ansic: 208,477; sh: 493; python: 411; makefile: 286; javascript: 174
file content (65 lines) | stat: -rw-r--r-- 1,756 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <fenv.h>
#include <iostream>
#include <limits>

int modes[4] = { FE_TOWARDZERO, FE_UPWARD, FE_DOWNWARD, FE_TONEAREST };

std::string str (int mode)
{
    switch (mode)	{
        case FE_TOWARDZERO: return "FE_TOWARDZERO";
        case FE_UPWARD:     return "FE_UPWARD";
        case FE_DOWNWARD:   return "FE_DOWNWARD";
        case FE_TONEAREST:  return "FE_TONEAREST";
        default:            throw __LINE__;
    }
}

int fetestround ()
{
    volatile double eps = std::numeric_limits<double>::denorm_min();

    double x = -1.0;
    double y =  1.0;
    volatile double x_plus_eps  = x + eps;
    volatile double y_minus_eps = y - eps;

    if ((x == x_plus_eps) && (y == y_minus_eps))
        return FE_TONEAREST;
    if (y == y_minus_eps)
        return FE_UPWARD;
    if (x == x_plus_eps)
        return FE_DOWNWARD;
    return FE_TOWARDZERO;
}

int main (int argc, char* argv[])
{
    int errors = 0;

    int mode_get = fegetround();
    std::cout << "fegetround() = " << str(mode_get) << "   " << std::endl;

    for (int i=0; i<4; i++)	{

        int mode_set = modes[i];
        fesetround (mode_set);
        std::cout << "fesetround (" << str(mode_set) << ")" << std::endl;
        
        int mode_get = fegetround();
        std::cout << "fegetround() = " << str(mode_get) << "   ";
        bool ok_get = mode_get == mode_set;
        if (!ok_get)
            ++errors;
        std::cout << (ok_get ? "(ok)" : "(error)") << std::endl;

        int mode_test = fetestround();
        std::cout << "fetestround() = " << str(mode_test) << "   ";
        bool ok_test = mode_test == mode_set;
        if (!ok_test)
            ++errors;
        std::cout << (ok_test ? "(ok)" : "(error)") << std::endl;
    }

    return errors;
}