Здравствуйте SAndrey, Вы писали:
КВ>>А ручками пробовал КВ>>double d; КВ>>int i = (int) (d + 0.5);
SA>руками можно многое, а ф-ия то есть. (на самом деле это вопрос о наличии, но за ответ спасибо)
Тогда может тебе это подойдет
(выдержка из MSDN)
ceil
Calculates the ceiling of a value.
double ceil( double x );
Routine Required Header Compatibility
ceil <math.h> ANSI, Win 95, Win NT
For additional compatibility information, see Compatibility in the Introduction.
Libraries
LIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version
Return Value
The ceil function returns a double value representing the smallest integer that is greater than or equal to x. There is no error return.
Parameter
x
Floating-point value
Example
/* FLOOR.C: This example displays the largest integers
* less than or equal to the floating-point values 2.8
* and -2.8. It then shows the smallest integers greater
* than or equal to 2.8 and -2.8.
*/
#include <math.h>
#include <stdio.h>
void main( void )
{
double y;
y = floor( 2.8 );
printf( "The floor of 2.8 is %f\n", y );
y = floor( -2.8 );
printf( "The floor of -2.8 is %f\n", y );
y = ceil( 2.8 );
printf( "The ceil of 2.8 is %f\n", y );
y = ceil( -2.8 );
printf( "The ceil of -2.8 is %f\n", y );
}
Output
The floor of 2.8 is 2.000000
The floor of -2.8 is -3.000000
The ceil of 2.8 is 3.000000
The ceil of -2.8 is -2.000000
Здравствуйте Кирпа В.А., Вы писали:
КВ>Здравствуйте SAndrey, Вы писали:
SA>>Господа подскажите в VС++ есть ли функция типа Round — а в Паскале? SA>>т.е. round(4.3) = 4 , а round(4.6)=5
КВ>А ручками пробовал КВ>double d; КВ>int i = (int) (d + 0.5); Это не правильно!
Здравствуйте Рек, Вы писали:
Рек>Здравствуйте Кирпа В.А., Вы писали:
КВ>>Здравствуйте SAndrey, Вы писали:
SA>>>Господа подскажите в VС++ есть ли функция типа Round — а в Паскале? SA>>>т.е. round(4.3) = 4 , а round(4.6)=5
КВ>>А ручками пробовал КВ>>double d; КВ>>int i = (int) (d + 0.5); Рек>Это не правильно!
Здравствуйте Кирпа В.А., Вы писали:
КВ>Здравствуйте Рек, Вы писали:
Рек>>Здравствуйте Кирпа В.А., Вы писали:
КВ>>>Здравствуйте SAndrey, Вы писали:
SA>>>>Господа подскажите в VС++ есть ли функция типа Round — а в Паскале? SA>>>>т.е. round(4.3) = 4 , а round(4.6)=5
КВ>>>А ручками пробовал КВ>>>double d; КВ>>>int i = (int) (d + 0.5); Рек>>Это не правильно!
Рек>>Надо вот так:
Рек>>
Рек>>int i = (int)floor(d + 0.5);
Рек>>
КВ>Просвети меня Рек почему у меня неверно?
КВ>
Например:
-0.6 по твоей фомуле округлится в 0 — это неверное округление.
Должно получиться -1.
Поэтому вынужден настаивать:
int round(double x) { return (int)floor(x + 0.5); }
Здравствуйте Рек, Вы писали:
Рек>Здравствуйте Кирпа В.А., Вы писали:
КВ>>Здравствуйте Рек, Вы писали:
Рек>>>Здравствуйте Кирпа В.А., Вы писали:
КВ>>>>Здравствуйте SAndrey, Вы писали:
SA>>>>>Господа подскажите в VС++ есть ли функция типа Round — а в Паскале? SA>>>>>т.е. round(4.3) = 4 , а round(4.6)=5
КВ>>>>А ручками пробовал КВ>>>>double d; КВ>>>>int i = (int) (d + 0.5); :super: Рек>>>Это не правильно!
Рек>>>Надо вот так:
Рек>>>
Рек>>>int i = (int)floor(d + 0.5);
Рек>>>
КВ>>Просвети меня Рек почему у меня неверно?
КВ>> :???:
Рек>Например: Рек>-0.6 по твоей фомуле округлится в 0 — это неверное округление. Рек>Должно получиться -1.
Рек>Поэтому вынужден настаивать: Рек>
Здравствуйте Кирпа В.А., Вы писали:
КВ>Согласен КВ>Тогда нужно делать так
КВ>#define round(d) ((int) ((d) + (((d) < 0.) ? -0.5: 0.5))) КВ>или КВ>int round(double d) { return (int) (d + ((d < 0.) ? -0.5: 0.5)): }
Почти всё хорошо, но...
для -0.5 по правилам округления должно получиться 0.0
("0.5" округляется в бОльшую сторону), а по твоей формуле получается -1.0.
Здравствуйте Patachu[KS], Вы писали:
Рек>>Почти всё хорошо, но... Рек>>для -0.5 по правилам округления должно получиться 0.0 Рек>>("0.5" округляется в бОльшую сторону), а по твоей формуле получается -1.0.
P[KS]>А вот и не так. Должно получиться именно -1.0.
P[KS]>Округляется модуль числа.
Нет.
Ты бы подумал, перед тем как такое писать!
Ведь это же дети могут прочитать! Они же двоек понахватают начитавшись такого!
(особенно беспокоюсь за четверокласников — у них сейчас именно эта тема!
Хорошо, что они ещё не знают, что такое модуль и конечно заподозрят неладное...)
Дети, не слушайте этого дядю.
Запомните правила округления чисел:
Если дробная часть числа больше или равна 0.5, то округляйте в бОльшую сторону,
если дробная часть числа меньше 0.5, то округляйте в мЕньшую.
Здравствуйте Рек, Вы писали:
Рек>Здравствуйте Patachu[KS], Вы писали:
Рек>>>Почти всё хорошо, но... Рек>>>для -0.5 по правилам округления должно получиться 0.0 Рек>>>("0.5" округляется в бОльшую сторону), а по твоей формуле получается -1.0.
P[KS]>>А вот и не так. Должно получиться именно -1.0.
P[KS]>>Округляется модуль числа.
Рек>Нет.
Рек>Ты бы подумал, перед тем как такое писать! Рек>Ведь это же дети могут прочитать! Они же двоек понахватают начитавшись такого! Рек>(особенно беспокоюсь за четверокласников — у них сейчас именно эта тема! Рек>Хорошо, что они ещё не знают, что такое модуль и конечно заподозрят неладное...)
Рек>Дети, не слушайте этого дядю. Рек>Запомните правила округления чисел:
Рек>Если дробная часть числа больше или равна 0.5, то округляйте в бОльшую сторону, Рек>если дробная часть числа меньше 0.5, то округляйте в мЕньшую.
Рек>
Следуя твоим правилам округления получаем round(-x) != -round(x), хотя функция round() по идее должна быть нечетной. Почему такая особенность для отрицательных чисел.
Например: Показываем в StatusBare координаты round(x), round(y) и видим
что при движении мыши влево и вправо от 0. мышка проходит одинаковый путь в пикселах, а в StatusBare не одинаковый. Нехорошо!
Здравствуйте Кирпа В.А., Вы писали:
КВ>Здравствуйте Рек, Вы писали:
КВ>Следуя твоим правилам округления получаем round(-x) != -round(x), хотя функция round() по идее должна быть нечетной. Почему такая особенность для отрицательных чисел. КВ>Например: Показываем в StatusBare координаты round(x), round(y) и видим КВ>что при движении мыши влево и вправо от 0. мышка проходит одинаковый путь в пикселах, а в StatusBare не одинаковый. Нехорошо! КВ> :???:
Вспылил. Был не прав.
Прошу прощения — дурил.
Как я понял, наименьшие ошибки в вычислениях
при округлении получаются, если следовать следующему правилу:
Полуцелые точки округляются в строну ближайшего четного целого числа!
Оказывается это застандартизовано в "IEEE Standard 754-1985"!