Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #84384

Re: Fast trunc() algorithm

From Bonita Montero <Bonita.Montero@gmail.com>
Newsgroups comp.lang.c++, comp.lang.c, de.comp.lang.c
Subject Re: Fast trunc() algorithm
Date 2022-05-31 05:41 +0200
Organization A noiseless patient Spider
Message-ID <t742o0$pha$1@dont-email.me> (permalink)
References <t6va0v$eno$1@dont-email.me>

Cross-posted to 3 groups.

Show all headers | View raw


The code can be much simpler and faster:

#include <cstdint>
#include <limits>
#include <cfenv>
#include <cstring>
#include "fmath.h"

using namespace std;

double ftrunc( double d )
{
	unsigned const
		MANTISSA_BITS = 52,
		EXP_BIAS = 0x3FF,
		INF_NAN_BASE = 0x7FF;
	constexpr uint64_t
		EXP_MASK = (uint64_t)0x7FF << MANTISSA_BITS,
		MANTISSA_MASK = 0x000FFFFFFFFFFFFFu,
		NAN_MASK = 0x0008000000000000u,
		MIN_PURE_INTEGRAL_EXP = (uint64_t)(EXP_BIAS + MANTISSA_BITS) << 
MANTISSA_BITS,
		INF_NAN_EXP = (uint64_t)INF_NAN_BASE << MANTISSA_BITS;
	uint64_t dx;
	memcpy( &dx, &d, 8 );
	uint64_t exp = dx & EXP_MASK;
	if( exp < MIN_PURE_INTEGRAL_EXP ) [[likely]]
		return (double)(int64_t)d;
	if( exp < INF_NAN_EXP ) [[likely]]
		// value has integral only mantissa bits
		return d;
	uint64_t mantissa = dx & MANTISSA_MASK;
	// infinite, NaN: return value
	if( !mantissa || mantissa & NAN_MASK ) [[likely]]
		return d;
	// SNaN: raise exception on SNaN if necessary
	feraiseexcept( FE_INVALID );
	return d;
}

float ftrunc( float f )
{
	static_assert(sizeof(float) == 4, "sizeof(float) not equal to 
sizeof(uint32_t)");
	static_assert(numeric_limits<float>::is_iec559, "float must be IEEE-754");
	constexpr unsigned
		MANTISSA_BITS = 23,
		EXP_BIAS = 0x7F,
		INF_NAN_BASE = 0xFF;
	constexpr uint32_t
		EXP_MASK = (uint32_t)0xFF << MANTISSA_BITS,
		SIGN_MASK = (uint32_t)0x100 << MANTISSA_BITS,
		MANTISSA_MASK = 0x007FFFFFu,
		NAN_MASK = 0x00400000u,
		MIN_PURE_INTEGRAL_EXP = (uint64_t)(EXP_BIAS + MANTISSA_BITS) << 
MANTISSA_BITS,
		INF_NAN_EXP = (uint32_t)INF_NAN_BASE << MANTISSA_BITS;
	uint32_t fx;
	memcpy( &fx, &f, 4 );
	uint32_t exp = fx & EXP_MASK;
	if( exp < MIN_PURE_INTEGRAL_EXP )
		return (float)(int64_t)f;
	if( exp < INF_NAN_EXP )
		// value has integral only mantissa bits
		return f;
	uint32_t mantissa = fx & MANTISSA_MASK;
	// infinite, NaN: return value
	if( !mantissa || mantissa & NAN_MASK )
		return f;
	// SNaN: raise exception on SNaN if necessary
	feraiseexcept( FE_INVALID );
	return f;
}

Back to comp.lang.c++ | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-29 10:14 +0200
  Re: Fast trunc() algorithm Muttley@dastardlyhq.com - 2022-05-29 08:21 +0000
    Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-29 10:29 +0200
      Re: Fast trunc() algorithm Freethinker <freethinker@mymail.com> - 2022-05-29 15:20 +0200
        Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-29 15:27 +0200
          Re: Fast trunc() algorithm Freethinker <freethinker@mymail.com> - 2022-05-29 15:37 +0200
            Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-29 15:46 +0200
    Re: Fast trunc() algorithm John McCue <jmccue@magnetar.hsd1.ma.comcast.net> - 2022-05-29 21:32 +0000
  Re: Fast trunc() algorithm Christian Gollwitzer <auriocus@gmx.de> - 2022-05-29 23:36 +0200
    Re: Fast trunc() algorithm Juha Nieminen <nospam@thanks.invalid> - 2022-05-30 06:22 +0000
      Re: Fast trunc() algorithm David Brown <david.brown@hesbynett.no> - 2022-05-30 08:59 +0200
      Re: Fast trunc() algorithm muttley@dastardlyhq.com - 2022-05-30 07:52 +0000
      Re: Fast trunc() algorithm Paavo Helde <eesnimi@osa.pri.ee> - 2022-05-30 11:58 +0300
    Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-30 11:32 +0200
  Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-30 11:34 +0200
  Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-05-31 05:41 +0200
    Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-06-01 18:07 +0200
      Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-06-01 18:09 +0200
      Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-06-02 04:43 +0200
        Re: Fast trunc() algorithm jak <nospam@please.ty> - 2022-06-02 07:44 +0200
          Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-06-02 08:14 +0200
            Re: Fast trunc() algorithm jak <nospam@please.ty> - 2022-06-02 11:14 +0200
              Re: Fast trunc() algorithm Bonita Montero <Bonita.Montero@gmail.com> - 2022-06-02 12:48 +0200

csiph-web