Path: blob/master/thirdparty/embree/common/math/constants.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "../sys/platform.h"67#include <limits>89#define _USE_MATH_DEFINES10#include <math.h> // using cmath causes issues under Windows11#include <cfloat>12#include <climits>1314namespace embree15{16static MAYBE_UNUSED const float one_over_255 = 1.0f/255.0f;17static MAYBE_UNUSED const float min_rcp_input = 1E-18f; // for abs(x) >= min_rcp_input the newton raphson rcp calculation does not fail1819/* we consider floating point numbers in that range as valid input numbers */20static MAYBE_UNUSED float FLT_LARGE = 1.844E18f;2122struct TrueTy {23__forceinline operator bool( ) const { return true; }24};2526const constexpr TrueTy True = TrueTy();2728struct FalseTy {29__forceinline operator bool( ) const { return false; }30};3132const constexpr FalseTy False = FalseTy();3334struct ZeroTy35{36__forceinline operator double ( ) const { return 0; }37__forceinline operator float ( ) const { return 0; }38__forceinline operator long long( ) const { return 0; }39__forceinline operator unsigned long long( ) const { return 0; }40__forceinline operator long ( ) const { return 0; }41__forceinline operator unsigned long ( ) const { return 0; }42__forceinline operator int ( ) const { return 0; }43__forceinline operator unsigned int ( ) const { return 0; }44__forceinline operator short ( ) const { return 0; }45__forceinline operator unsigned short ( ) const { return 0; }46__forceinline operator char ( ) const { return 0; }47__forceinline operator unsigned char ( ) const { return 0; }48};4950const constexpr ZeroTy zero = ZeroTy();5152struct OneTy53{54__forceinline operator double ( ) const { return 1; }55__forceinline operator float ( ) const { return 1; }56__forceinline operator long long( ) const { return 1; }57__forceinline operator unsigned long long( ) const { return 1; }58__forceinline operator long ( ) const { return 1; }59__forceinline operator unsigned long ( ) const { return 1; }60__forceinline operator int ( ) const { return 1; }61__forceinline operator unsigned int ( ) const { return 1; }62__forceinline operator short ( ) const { return 1; }63__forceinline operator unsigned short ( ) const { return 1; }64__forceinline operator char ( ) const { return 1; }65__forceinline operator unsigned char ( ) const { return 1; }66};6768const constexpr OneTy one = OneTy();6970struct NegInfTy71{72__forceinline operator double ( ) const { return -std::numeric_limits<double>::infinity(); }73__forceinline operator float ( ) const { return -std::numeric_limits<float>::infinity(); }74__forceinline operator long long( ) const { return std::numeric_limits<long long>::min(); }75__forceinline operator unsigned long long( ) const { return std::numeric_limits<unsigned long long>::min(); }76__forceinline operator long ( ) const { return std::numeric_limits<long>::min(); }77__forceinline operator unsigned long ( ) const { return std::numeric_limits<unsigned long>::min(); }78__forceinline operator int ( ) const { return std::numeric_limits<int>::min(); }79__forceinline operator unsigned int ( ) const { return std::numeric_limits<unsigned int>::min(); }80__forceinline operator short ( ) const { return std::numeric_limits<short>::min(); }81__forceinline operator unsigned short ( ) const { return std::numeric_limits<unsigned short>::min(); }82__forceinline operator char ( ) const { return std::numeric_limits<char>::min(); }83__forceinline operator unsigned char ( ) const { return std::numeric_limits<unsigned char>::min(); }8485};8687const constexpr NegInfTy neg_inf = NegInfTy();8889struct PosInfTy90{91__forceinline operator double ( ) const { return std::numeric_limits<double>::infinity(); }92__forceinline operator float ( ) const { return std::numeric_limits<float>::infinity(); }93__forceinline operator long long( ) const { return std::numeric_limits<long long>::max(); }94__forceinline operator unsigned long long( ) const { return std::numeric_limits<unsigned long long>::max(); }95__forceinline operator long ( ) const { return std::numeric_limits<long>::max(); }96__forceinline operator unsigned long ( ) const { return std::numeric_limits<unsigned long>::max(); }97__forceinline operator int ( ) const { return std::numeric_limits<int>::max(); }98__forceinline operator unsigned int ( ) const { return std::numeric_limits<unsigned int>::max(); }99__forceinline operator short ( ) const { return std::numeric_limits<short>::max(); }100__forceinline operator unsigned short ( ) const { return std::numeric_limits<unsigned short>::max(); }101__forceinline operator char ( ) const { return std::numeric_limits<char>::max(); }102__forceinline operator unsigned char ( ) const { return std::numeric_limits<unsigned char>::max(); }103};104105const constexpr PosInfTy inf = PosInfTy();106const constexpr PosInfTy pos_inf = PosInfTy();107108struct NaNTy109{110__forceinline operator double( ) const { return std::numeric_limits<double>::quiet_NaN(); }111__forceinline operator float ( ) const { return std::numeric_limits<float>::quiet_NaN(); }112};113114const constexpr NaNTy nan = NaNTy();115116struct UlpTy117{118__forceinline operator double( ) const { return std::numeric_limits<double>::epsilon(); }119__forceinline operator float ( ) const { return std::numeric_limits<float>::epsilon(); }120};121122const constexpr UlpTy ulp = UlpTy();123124struct PiTy125{126__forceinline operator double( ) const { return double(M_PI); }127__forceinline operator float ( ) const { return float(M_PI); }128};129130const constexpr PiTy pi = PiTy();131132struct OneOverPiTy133{134__forceinline operator double( ) const { return double(M_1_PI); }135__forceinline operator float ( ) const { return float(M_1_PI); }136};137138const constexpr OneOverPiTy one_over_pi = OneOverPiTy();139140struct TwoPiTy141{142__forceinline operator double( ) const { return double(2.0*M_PI); }143__forceinline operator float ( ) const { return float(2.0*M_PI); }144};145146const constexpr TwoPiTy two_pi = TwoPiTy();147148struct OneOverTwoPiTy149{150__forceinline operator double( ) const { return double(0.5*M_1_PI); }151__forceinline operator float ( ) const { return float(0.5*M_1_PI); }152};153154const constexpr OneOverTwoPiTy one_over_two_pi = OneOverTwoPiTy();155156struct FourPiTy157{158__forceinline operator double( ) const { return double(4.0*M_PI); }159__forceinline operator float ( ) const { return float(4.0*M_PI); }160};161162const constexpr FourPiTy four_pi = FourPiTy();163164struct OneOverFourPiTy165{166__forceinline operator double( ) const { return double(0.25*M_1_PI); }167__forceinline operator float ( ) const { return float(0.25*M_1_PI); }168};169170const constexpr OneOverFourPiTy one_over_four_pi = OneOverFourPiTy();171172struct StepTy {173__forceinline operator double ( ) const { return 0; }174__forceinline operator float ( ) const { return 0; }175__forceinline operator long long( ) const { return 0; }176__forceinline operator unsigned long long( ) const { return 0; }177__forceinline operator long ( ) const { return 0; }178__forceinline operator unsigned long ( ) const { return 0; }179__forceinline operator int ( ) const { return 0; }180__forceinline operator unsigned int ( ) const { return 0; }181__forceinline operator short ( ) const { return 0; }182__forceinline operator unsigned short ( ) const { return 0; }183__forceinline operator char ( ) const { return 0; }184__forceinline operator unsigned char ( ) const { return 0; }185};186187const constexpr StepTy step = StepTy();188189struct ReverseStepTy {190};191192const constexpr ReverseStepTy reverse_step = ReverseStepTy();193194struct EmptyTy {195};196197const constexpr EmptyTy empty = EmptyTy();198199struct FullTy {200};201202const constexpr FullTy full = FullTy();203204struct UndefinedTy {205};206207const constexpr UndefinedTy undefined = UndefinedTy();208}209210211