1/*
2 * Copyright (c) 2014, Andreas Sandberg
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 *    copyright notice, this list of conditions and the following
13 *    disclaimer in the documentation and/or other materials provided
14 *    with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 * OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef _FPTYPES_H
31#define _FPTYPES_H 1
32
33#include <stdint.h>
34
35#ifdef  __cplusplus
36extern "C" {
37#endif
38
39/**
40 * @addtogroup fp64
41 * @{
42 */
43
44/** Internal representation of a 64-bit float */
45typedef union {
46    /**
47     * Raw value exposed as an unsigned integer. Mainly used for bit
48     * manipulation.
49     */
50    uint64_t bits;
51    /** Representation using the built-in double type */
52    double value;
53} fp64_t;
54
55/** @} */
56
57
58/**
59 * @addtogroup fp80
60 * @{
61 */
62
63/** Internal representation of an 80-bit float. */
64typedef union  {
65    struct {
66        /** Raw representation of the integer part bit and the
67         * fraction. Note that unlike 64-bit floating point
68         * representations the integer bit is explicit. */
69        uint64_t fi;
70        /** Raw representation of sign bit and exponent */
71        uint16_t se;
72        /** Add explicit padding to ensure this data structure
73         * is properly aligned.
74         */
75        uint16_t pad[3];
76    } repr;
77    /**
78     * Represented as a char array, mainly intended for debug dumping
79     * and serialization.
80     */
81    char bits[16];
82} fp80_t;
83
84/** @} */
85
86#ifdef  __cplusplus
87} /* extern "C" */
88#endif
89
90#endif
91