LibreOffice
LibreOffice 6.4 SDK C/C++ API Reference
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
sal
mathconf.h
Go to the documentation of this file.
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
* This file is part of the LibreOffice project.
4
*
5
* This Source Code Form is subject to the terms of the Mozilla Public
6
* License, v. 2.0. If a copy of the MPL was not distributed with this
7
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
*
9
* This file incorporates work covered by the following license notice:
10
*
11
* Licensed to the Apache Software Foundation (ASF) under one or more
12
* contributor license agreements. See the NOTICE file distributed
13
* with this work for additional information regarding copyright
14
* ownership. The ASF licenses this file to you under the Apache
15
* License, Version 2.0 (the "License"); you may not use this file
16
* except in compliance with the License. You may obtain a copy of
17
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
*/
19
20
#ifndef INCLUDED_SAL_MATHCONF_H
21
#define INCLUDED_SAL_MATHCONF_H
22
23
#include "
osl/endian.h
"
24
25
#if defined __sun
26
#include <ieeefp.h>
27
#endif
/* __sun */
28
29
#if defined(__cplusplus) && ( defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L )
30
#include <cmath>
31
#endif
32
33
#if defined(IOS)
34
#if defined(__cplusplus)
35
#include <cmath>
36
#else
37
#include <
math.h
>
38
#endif
39
#endif
40
41
#if defined __cplusplus
42
extern
"C"
{
43
#endif
/* __cplusplus */
44
45
46
/* Generally, the C standard guarantees that at program startup, "trapping or
47
stopping (if supported) is disabled on all [floating-point] exceptions"
48
(F.7.3/1 of the August 3, 1998 draft of C99), and that during program
49
execution, "a programmer can safely assume default modes (or be unaware of
50
them)" (7.6/2, footnote 161 of the August 3, 1998 draft of C99). Reportedly,
51
on Windows there are printer drivers that switch on exceptions. To avoid
52
problems, the SAL_MATH_FPEXCEPTIONS_OFF macro can be used to explicitly
53
switch off exceptions (on Windows).
54
*/
55
#if defined(_WIN32)
56
#define SAL_MATH_FPEXCEPTIONS_OFF() _control87( _MCW_EM, _MCW_EM )
57
#else
/* WNT */
58
#define SAL_MATH_FPEXCEPTIONS_OFF()
59
#endif
/* WNT */
60
61
62
/* SAL_MATH_FINITE(d): test double d on INFINITY, NaN et al. */
63
#if !defined __sun && !defined ANDROID \
64
&& defined(__cplusplus) \
65
&& ( defined(__GXX_EXPERIMENTAL_CXX0X__) \
66
|| __cplusplus >= 201103L \
67
|| defined(IOS) )
68
#define SAL_MATH_FINITE(d) std::isfinite(d)
69
#elif defined( IOS )
70
#define SAL_MATH_FINITE(d) isfinite(d)
71
#elif defined( WNT)
72
#define SAL_MATH_FINITE(d) _finite(d)
73
#elif defined(ANDROID) || defined LINUX || defined UNX
74
#define SAL_MATH_FINITE(d) finite(d)
75
#else
/* WNT, LINUX, UNX */
76
#error "SAL_MATH_FINITE not defined"
77
#endif
/* WNT, LINUX, UNX */
78
79
80
/* This needs to be fixed for non--IEEE-754 platforms: */
81
#if 1
/* IEEE 754 supported */
82
#if defined OSL_BIGENDIAN
83
84
/* IEEE 754 double structures for BigEndian */
85
union
sal_math_Double
86
{
87
struct
88
{
89
unsigned
sign : 1;
90
unsigned
exponent :11;
91
unsigned
fraction_hi :20;
92
unsigned
fraction_lo :32;
93
} inf_parts;
94
struct
95
{
96
unsigned
sign : 1;
97
unsigned
exponent :11;
98
unsigned
qnan_bit : 1;
99
unsigned
bits :19;
100
unsigned
fraction_lo :32;
101
} nan_parts;
102
struct
103
{
104
unsigned
msw :32;
105
unsigned
lsw :32;
106
} w32_parts;
107
double
value;
108
};
109
110
#elif defined OSL_LITENDIAN
111
112
/* IEEE 754 double structures for LittleEndian */
113
union
sal_math_Double
114
{
115
struct
{
116
unsigned
fraction_lo :32;
117
unsigned
fraction_hi :20;
118
unsigned
exponent :11;
119
unsigned
sign : 1;
120
} inf_parts;
121
struct
{
122
unsigned
fraction_lo :32;
123
unsigned
bits :19;
124
unsigned
qnan_bit : 1;
125
unsigned
exponent :11;
126
unsigned
sign : 1;
127
} nan_parts;
128
struct
129
{
130
unsigned
lsw :32;
131
unsigned
msw :32;
132
} w32_parts;
133
double
value;
134
};
135
136
#else
/* OSL_BIGENDIAN, OSL_LITENDIAN */
137
138
#error "neither OSL_BIGENDIAN nor OSL_LITENDIAN"
139
140
#endif
/* OSL_BIGENDIAN, OSL_LITENDIAN */
141
#else
/* IEEE 754 supported */
142
143
#error "don't know how to handle IEEE 754"
144
145
#endif
/* IEEE 754 supported */
146
147
148
#if defined __cplusplus
149
}
150
#endif
/* __cplusplus */
151
152
#endif
/* INCLUDED_SAL_MATHCONF_H */
153
154
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
endian.h
math.h
Generated by
1.8.5