File: CheckFloatPrecision.cmake

package info (click to toggle)
cryptominisat 5.11.21%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 4,488 kB
  • sloc: cpp: 55,562; ansic: 7,786; python: 7,485; sh: 813; sql: 403; xml: 34; makefile: 22; javascript: 17
file content (51 lines) | stat: -rw-r--r-- 1,627 bytes parent folder | download | duplicates (3)
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
# Floating point precision checks
#
# This file contains floating point precision checks
#
# This file is released under public domain - or - in countries where this is
# not possible under the following license:
#
#    Permission is hereby granted, free of charge, to any person obtaining a
#    copy of this software, to deal in the software without restriction,
#    including without limitation the rights to use, copy, modify, merge,
#    publish, distribute, sublicense, and/or sell copies of the software,
#    and to permit persons to whom the software is furnished to do so, subject
#    to no condition whatsoever.
#
#    This software is provided AS IS, without warranty of any kind, express or
#    implied.

# FIXME:
#  This file was only built for x86 and x86_64 platforms but it does not check
#  for the platform since CMake does not provide a viable variable.

include(CheckCSourceRuns)

macro(check_float_precision)
 check_c_source_runs("
  #include <stdio.h>
  #include <string.h>
  #include <fpu_control.h>
 
  double div (double a, double b) {
    fpu_control_t fpu_oldcw, fpu_cw;
    volatile double result;
 
    _FPU_GETCW(fpu_oldcw);
    fpu_cw = (fpu_oldcw & ~_FPU_EXTENDED & ~_FPU_SINGLE) | _FPU_DOUBLE;
    _FPU_SETCW(fpu_cw);
    result = a / b;
    _FPU_SETCW(fpu_oldcw);
    return result;
  }
 
  int main (int argc, char **argv) {
    double d = div (2877.0, 1000000.0);
    char buf[255];
    sprintf(buf, \"%.30f\", d);
    // see if the result is actually in double precision
    return strncmp(buf, \"0.00287699\", 10) == 0 ? 0 : 1;
  }
 " HAVE__FPU_SETCW)

endmacro(check_float_precision)