Как избежать использования временной переменной с std :: modf? - PullRequest
4 голосов
/ 20 мая 2019

Недавно я столкнулся с проблемой, когда у меня произошла ошибка в MSVC, а в GCC - нет.

Через несколько часов я понял, что, по-видимому, моя версия MSVC не поддерживает следующий синтаксис:

double value = 3.4;
double fractional = std::modf(value, nullptr);

где я не хочу / забочусь о всей части номера.

Да, я знаю, что могу сделать «3.4 - 3.0» или что-то подобное, но меня беспокоит то, как конкретно использовать modf таким образом. В настоящее время я вижу только это через:

double temp; 
double value = 3.4;
double fractional = std::modf(value, &temp);

Есть ли способ обойти эту временную переменную?

Ответы [ 2 ]

4 голосов
/ 20 мая 2019

Если после этого вам не нужно value, вы можете назвать его как

double value = 3.4;
double fractional = std::modf(value, &value);

Если вам все еще нужно исходное значение, вы можете легко восстановить его.

PS : Я не нашел упоминаний о том, что nullptr является допустимым параметром. Может быть, MSVC прав в том, чтобы идти на хаос.

PS2: Я бы не слишком беспокоился о ненужных временных. Я ожидал бы, что компилятор сгенерирует подобный код, и явное упоминание временного является намного чище и более читабельным по сравнению с передачей value просто для того, чтобы избежать временного.

4 голосов
/ 20 мая 2019

Вы можете написать простую обертку, чтобы сделать это:

double frac(double value)
{
    double temp;
    return std::modf(value, &temp);
}

Таким образом, компилятор может оптимизировать temp.

РЕДАКТИРОВАТЬ: Это также может быть объединено с @ прежним известнымas_463035818идея без потери value:

double frac(double value)
{
    return std::modf(value, &value);
}

Или даже лучше, комментарий @ NathanOliver (РЕДАКТИРОВАТЬ благодаря комментариям @ Evg):

double frac(double value)
{
    int sign = value >= 0 ? 1 : -1;
    double avalue = std::abs(value)
    return std::isinf(value) ? 0.0 : sign * (avalue - std::floor(avalue));
}

Это лучше, потому что яснои не содержит никаких уловок.

...