Форум программистов, компьютерный форум CyberForum.ru

Округление float до единицы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:25     Округление float до единицы #1
Например есть число с плавающей точкой. Как его превратить в единицу без преобразования типа в int?
Желательно без использования условных операторов.
например:
C++
float R = -1.97043;
 
float Q = foo(R); // Q = -1.0
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 13:36     Округление float до единицы #2
Цитата Сообщение от programina Посмотреть сообщение
Как его превратить в единицу без преобразования типа в int?
float f = 1;
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
07.11.2013, 13:39     Округление float до единицы #3
C++
1
float R = -1.97043;
Цитата Сообщение от programina Посмотреть сообщение
float Q = foo(R); // Q = -1.0
C++
1
Q = -(R / R);
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:44  [ТС]     Округление float до единицы #4
castaway, Raali, не то. Знак должен сохраняться. То есть было -7.678 стало -1.0, было 7.678 стало 1.0.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 13:46     Округление float до единицы #5
C++
1
Q = R > 0? R / R : R / -R;
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
07.11.2013, 13:48     Округление float до единицы #6
C++
1
Q = R / abs(R);
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:51  [ТС]     Округление float до единицы #7
Jazz411, а без условных операторов?

Добавлено через 2 минуты
Цитата Сообщение от Raali Посмотреть сообщение
C++
1
Q = R / abs(R);
abs() - это тот же условный оператор, но завернутый в функцию.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 13:53     Округление float до единицы #8
programina, ну по сути разницы нет, разве что для улучшения читабельности
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
07.11.2013, 14:04     Округление float до единицы #9
Цитата Сообщение от programina Посмотреть сообщение
было -7.678 стало -1.0, было 7.678 стало 1.0.
Может
было -7.678 стало -7.0, было 7.678 стало 7.0.
или что это за хрень?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 14:04     Округление float до единицы #10
могу предложить поколдовать с битами
C++
1
2
3
4
5
union foo
{
  float fvalue;
  int ivalue;
};
но выглядеть будет ужасно
чем варианты с условными операторами не угодили? неравная борьба за такты?)
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:08     Округление float до единицы #11
C++
1
2
    float R = -1.97043;
    float Q = -((float)((int32_t)R & 0x80000000 >> 30) - 1);
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:18  [ТС]     Округление float до единицы #12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
или что это за хрень?
Нет, -7.678 должно превратиться в -1.0

Добавлено через 4 минуты
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
2
    float R = -1.97043;
    float Q = -((float)((int32_t)R & 0x80000000 >> 30) - 1);
а если R = -3.970..., то теряется знак.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:28     Округление float до единицы #13
Да, ошибся.
C++
1
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:36  [ТС]     Округление float до единицы #14
Цитата Сообщение от castaway Посмотреть сообщение
Да, ошибся.
C++
1
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
ideone.com не может вывести результат. И int32_t тот же самый int
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:39     Округление float до единицы #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Всё выводит. http://ideone.com/l4JoPM
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:50  [ТС]     Округление float до единицы #16
Цитата Сообщение от castaway Посмотреть сообщение
Всё выводит. http://ideone.com/l4JoPM
здесь видно, но я захожу туда с телефона, видимо сайт зависает.
В общем задача не решена, но вам за необычное решение оставлю отзыв.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:51     Округление float до единицы #17
Цитата Сообщение от programina Посмотреть сообщение
В общем задача не решена
Это рабочее решение. Проверено на цикле от -10.0 до 10.0 с маленьким шагом.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
07.11.2013, 14:58     Округление float до единицы #18
Цитата Сообщение от castaway Посмотреть сообщение
Это рабочее решение. Проверено на цикле от -10.0 до 10.0 с маленьким шагом.
просто в условии было
Цитата Сообщение от programina Посмотреть сообщение
без преобразования типа в int?
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 15:14     Округление float до единицы #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Про преобразование то я и забыл...
Можно по-другому. Тут нет явного преобразования.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cstdio>
 
union my_float {
    float   value;
    struct {
        int m : 23;
        int e : 8;
        int s : 1;
    } raw;
};
 
int main() {
    for ( float R = -10; R <= 10; R += .03f ) {
        my_float mf;
        mf.value = R;
        float Q = (mf.raw.s << 1) + 1;
        printf( "%5.1f: %f\n", R, Q );
    }
    return 0;
}
http://ideone.com/RwUwJC
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2013, 15:19     Округление float до единицы
Еще ссылки по теме:

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing C++
cannot convert `float' to `float*. Почему так происходит? C++
C++ Чем отличаются float преобразования (float)var от float(var)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 15:19     Округление float до единицы #20
SatanaXIII, что не ясно флоат к 1, как написано так и сделано
Yandex
Объявления
07.11.2013, 15:19     Округление float до единицы
Ответ Создать тему
Опции темы

Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru