Существует ли функция округления C, такая как функция округления MATLAB? - PullRequest
4 голосов
/ 30 августа 2010

Мне нужна функция округления C, которая округляет числа, такие как функция округления MATLAB. Есть один? Если вы не знаете, как работает функция округления в MATLAB, перейдите по этой ссылке:

Функция MATLAB round

Я подумал, что мог бы просто написать свою собственную простую функцию округления, соответствующую функциональности MATLAB.

Спасибо

DemiSheep

Ответы [ 6 ]

7 голосов
/ 30 августа 2010

Это похоже на функцию round () из math.h

Эти функции округляют свой аргумент до ближайшего целочисленного значения в формате с плавающей запятой, округляя наполовинуслучаи, отличные от нуля, независимо от текущего направления округления.

Существует также lrint (), который дает вам возвращаемое значение типа int, хотя lrint () и друзья подчиняются текущему округлениюнаправление - вам нужно установить это, используя fesetround (), различные направления округления находятся здесь .

3 голосов
/ 30 августа 2010

Проверьте стандартный заголовок <fenv.c>, в частности, функцию fesetround() и четыре макроса FE_DOWNWARD, FE_TOWARDZERO, FE_TONEAREST и FE_UPWARD. Это управляет тем, как значения с плавающей запятой округляются до целых. Убедитесь, что ваша реализация (т.е. библиотека компилятора C / C) действительно поддерживает это (проверив возвращаемое значение fesetround() и документацию вашей реализации).

Функции, учитывающие эти настройки, включают (от <math.h>):

  • llrint()
  • llrintf()
  • llrintl()
  • lrint()
  • lrintf()
  • lrintl()
  • rint()
  • rintf()
  • rintl()
  • llround()
  • llroundf()
  • llroundl()
  • lround()
  • lroundf()
  • lroundl()
  • nearbyint()
  • nearbyintf()
  • nearbyintl()

в зависимости от ваших потребностей (тип параметра и тип возвращаемого значения, с неточным исключением с плавающей запятой или без него).

NOTE : round(), roundf() и roundl() do выглядят как будто они принадлежат в списке выше, но эти три делают не честь режим округления, установленный fesetround() !!

Для получения более подробной информации обратитесь к своей самой любимой документации стандартной библиотеки.

3 голосов
/ 30 августа 2010

Нет, C (до C99) не имеет функции round.Типичный подход выглядит примерно так:

double sign(double x) { 
    if (x < 0.0)
        return -1.0;
    return 1.0;
}

double round(double x) { 
    return (long long)x + 0.5 * sign(x);
}

Это округляет до целого числа, предполагая, что исходное число находится в диапазоне, который может быть представлен long long.Если вы хотите округлить до определенного количества мест после десятичной точки, это может быть немного сложнее.Если числа не слишком велики или слишком малы, вы можете умножить на 10 N , округлить до целого числа и снова разделить на 10 N (учитывая, что это может привести кнекоторые собственные ошибки округления).

2 голосов
/ 30 августа 2010

Если в стандартной библиотеке нет функции round(), вы можете, если имеете дело с числами с плавающей запятой, произвольно оценивать каждое значение, анализировать число в том месте после того, как вы хотите округлить, проверить видеть, больше ли оно, равно или меньше 5; Затем, если значение меньше 5, вы можете floor() число, на которое вы в конечном итоге смотрите. Если значение цифры после места, к которому вы округляете, равно 5 или больше, вы можете перейти к функции floor() оцениваемого числа, а затем добавить 1.

Я прошу прощения за любую неэффективность, связанную с этим.

1 голос
/ 30 августа 2010

Если я не ошибаюсь, вы ищете что-то вроде floor and ceil , и вы найдете их в <math.h>

0 голосов
/ 31 августа 2010

В документации указывается

Y = round (X) округляет элементы X до ближайших целых.

Не во множественном числе: согласно обычным операциям MATLAB,он действует на все элементы матрицы.Вышеприведенные эквиваленты C имеют дело только с одним значением одновременно. Если , вы можете использовать C ++, проверьте Valarray .Если нет, то добрый старый цикл - твой друг.

...