_nextafterf на Visual C ++ - PullRequest
       1

_nextafterf на Visual C ++

2 голосов
/ 05 мая 2011

Мне нужно использовать функцию _nextafterf в 32-битном Visual C ++, чтобы вычислить расстояние в ULP для сравнения некоторых результатов с эталонными функциями.

C99 предоставляет nextafterf и nextafter для float и double, но эти функции не поддерживаются в Visual C ++. Тем не менее, Visual C ++ 2010 поддерживает _nextafterf и nextafter from, но только в 64 битах ... В 32-битной модели поддерживается только _nextafter и from ...

Есть ли способ заставить _nextafterf работать на Visual Studio, возможно, до Visual C ++ 2005?

Спасибо, Christophe

Ответы [ 3 ]

3 голосов
/ 05 мая 2011

Существует шаблонный эквивалент nextafter в Boost.Math, см. Поиск следующего представимого значения в определенном направлении (nextafter) .

Функции C99 должны использовать суффиксы f и л, чтобы различить поплавок и длинный двойные версии. C ++ использует шаблон механизм вместо.

1 голос
/ 05 мая 2011

Вы всегда можете реализовать это ...

https://www.google.com/search?q=libm%2Fsrc%2Fs_nextafterf.c

0 голосов
/ 28 апреля 2015

нашел код здесь:

/*
 *  nextafterf.c
 *  cLibm
 *
 *  Created by Ian Ollmann on 6/14/07.
 *  Copyright 2007 Apple Inc. All rights reserved.
 *
 */
...
float nextafterf( float x, float y )
{
union{ float f; uint32_t u;} ux = { x };
uint32_t    step = 1;

if( y != y || x != x)
    return x + y;

if( y <= x ) // a subtraction here would risk Inf-Inf
{
    if( y == x )
        return y;   //make sure sign of 0 is correct

    step = -1;
}

//correct for the sign
int32_t signMask = (int32_t) ux.u >> 31;
step = (step ^ signMask) - signMask;

uint32_t absux = ux.u & 0x7fffffffU;

if( absux == 0 )                // zero
{
    ux.f = y;
    ux.u = (ux.u & 0x80000000U) + 1U;
    return ux.f;
}

ux.u += step;
return ux.f;
}

http://www.opensource.apple.com/source/Libm/Libm-315/Source/ARM/nextafterf.c

работа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...