реклама на сайте
подробности

 
 
> Как правильно выполнять округление до ближайшего?, RealView Compiler
sonycman
сообщение Dec 13 2009, 23:19
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Заметил, что при приведении типа с плав. точкой (float) к целочисленному значению, дробная часть просто выкидывается, или производится округление к нулю: было 4.8, стало -> 4.
А надо бы юзать округление до ближайшего целого -> 5.

Пришлось подключить хидер rt_fp.h и пользоваться тамошней функцией UINT _ffixu_r(float).

Может быть, режим округления можно изменить каким-то другим, более правильным путём, не прибегая к вызову функций внешней библиотеки?

И почему такой грубый способ округления юзается по умолчанию? Разве это правильно - 4.8 округлять до 4? cranky.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sneg_87
сообщение Dec 14 2009, 16:22
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882



предлагаю такой вариант:

long a=5.6;
//перед преобразованием умножать на 10, чтоб был остаток от деления в дальнейшем
a=a*10;
//теперь а=56
a=((int)(a+a%10))/10;
//поясню (int) (56+6) и деленое на 10 будет 6, что и необходимо

для отрицательного числа тоже пойдет


ЗЫ при проверке в досовском Borland: задавал а=5.1 далее умножал на 10 и получал а=50.999. кто может объяснить в чем дело?


--------------------
coding, кодинг, koDinГ, copyriting, printing ....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 14 2009, 17:25
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sneg_87 @ Dec 14 2009, 19:22) *
long a=5.6;

Ну, дальше можно уже не читать.

Цитата(Sneg_87 @ Dec 14 2009, 19:22) *
//перед преобразованием умножать на 10, чтоб был остаток от деления в дальнейшем
a=a*10;
//теперь а=56
a=((int)(a+a%10))/10;
//поясню (int) (56+6) и деленое на 10 будет 6, что и необходимо

Умножение + 2 деления + сложение = хороший пример того, как делать не надо.
Go to the top of the page
 
+Quote Post
Sneg_87
сообщение Dec 15 2009, 18:35
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 12-10-09
Пользователь №: 52 882



Цитата(aaarrr @ Dec 14 2009, 22:25) *
Умножение + 2 деления + сложение = хороший пример того, как делать не надо.

Чем плох вариант без подключения внешних библиотек? Единственным пожалуй минусом является время, что думаю не критично для ситуации. Ну а вторымб что он не пойдет, сейчас исправим smile.gif

Вот работающий на 100% (сам проверял) листинг программки, выдающий требуемый результат:
Код
#include "stdio.h"
#include "conio.h"
#include <iostream.h>

main () {
clrscr();
float a=6.9;
int b=0;
a=a*10;
b=a;
b=((int)(b+b%10))/10;
printf ("%i",буква "b" не вводилась на форуме);
getch();
}


Сообщение отредактировал rezident - Dec 16 2009, 00:19
Причина редактирования: Оформление цитаты исходника.


--------------------
coding, кодинг, koDinГ, copyriting, printing ....
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 15 2009, 18:35
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Sneg_87 @ Dec 15 2009, 21:12) *
Чем плох вариант без подключения внешних библиотек?

Он бесконечно хуже такого макроса:
Код
#define FROUNDS(x)                (((x)>=0)?(long)((x)+0.5f):(long)((x)-0.5f))

А уж это (выделено):
Цитата
b=((int)(b+b%10))/10;

- вообще ни в какие ворота.

А то, что он "работает" - так это, извините, не аргумент.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   Как правильно выполнять округление до ближайшего?   Dec 13 2009, 23:19
- - rezident   Приведение типа переменной и округление чисел, воо...   Dec 13 2009, 23:26
|- - aaarrr   Цитата(rezident @ Dec 14 2009, 02:26) Сам...   Dec 13 2009, 23:52
|- - rezident   Цитата(aaarrr @ Dec 14 2009, 04:52) Тольк...   Dec 14 2009, 00:43
|- - sonycman   Цитата(rezident @ Dec 14 2009, 03:26) При...   Dec 14 2009, 09:23
|- - demiurg_spb   Цитата(sonycman @ Dec 14 2009, 12:23) А в...   Dec 14 2009, 09:44
- - Microwatt   да, один клерк в банке наокруглял десятые доли цен...   Dec 14 2009, 01:22
- - dch   Цитата(sonycman @ Dec 14 2009, 02:19) Раз...   Dec 14 2009, 02:00
- - sonycman   demiurg_spb По идее да - floor округляет до целого...   Dec 14 2009, 09:53
|- - demiurg_spb   Цитата(sonycman @ Dec 14 2009, 12:53) В п...   Dec 14 2009, 10:54
- - tag   Цитата(sonycman @ Dec 14 2009, 02:19) Зам...   Dec 14 2009, 11:24
|- - sonycman   Цитата(tag @ Dec 14 2009, 15:24) В описан...   Dec 14 2009, 11:44
- - baralgin   sonycman Операция отбрасывания дробной части лёгк...   Dec 14 2009, 13:16
|- - sonycman   Цитата(baralgin @ Dec 14 2009, 17:16) Ммм...   Dec 14 2009, 15:39
||- - Sneg_87   Цитата(aaarrr @ Dec 15 2009, 23:35) А то,...   Dec 16 2009, 18:56
|- - demiurg_spb   Цитата(Sneg_87 @ Dec 14 2009, 19:22) ЗЫ п...   Dec 15 2009, 17:57
- - sigmaN   Sneg_87, такие "конструкции" в реальных ...   Dec 16 2009, 23:35


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 13:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01432 секунд с 7
ELECTRONIX ©2004-2016