Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

07.11.2013, 13:25. Просмотров 1572. Ответов 36
Метки нет (Все метки)

Например есть число с плавающей точкой. Как его превратить в единицу без преобразования типа в int?
Желательно без использования условных операторов.
например:
C++
float R = -1.97043;
 
float Q = foo(R); // Q = -1.0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 13:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Округление float до единицы (C++):

Округление после запятой float
Как прописать формат что бы после запятой было только 2 числа? Тип: FLOAT ...

Округление при преобразовании float в int
Нужно абсолютно точно реализовать формулы типа j=B-i*b)/h; m1=H/h; и т.п....

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float...

Замена нулей на единицы и единицы на нули в матрицах с использованием функций
Всем доброго времени суток! Пишу программу в которой должна производиться...

Чем отличаются float преобразования (float)var от float(var)
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

invalid types `float[float]' for array subscript
void SEARCH(float vol, float price, int i) { if (i>N) { ...

36
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 13:36 #2
Цитата Сообщение от programina Посмотреть сообщение
Как его превратить в единицу без преобразования типа в int?
float f = 1;
2
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
07.11.2013, 13:39 #3
C++
1
float R = -1.97043;
Цитата Сообщение от programina Посмотреть сообщение
float Q = foo(R); // Q = -1.0
C++
1
Q = -(R / R);
1
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:44  [ТС] #4
castaway, Raali, не то. Знак должен сохраняться. То есть было -7.678 стало -1.0, было 7.678 стало 1.0.
0
Jazz411
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 13:46 #5
C++
1
Q = R > 0? R / R : R / -R;
1
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
07.11.2013, 13:48 #6
C++
1
Q = R / abs(R);
1
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:51  [ТС] #7
Jazz411, а без условных операторов?

Добавлено через 2 минуты
Цитата Сообщение от Raali Посмотреть сообщение
C++
1
Q = R / abs(R);
abs() - это тот же условный оператор, но завернутый в функцию.
0
Jazz411
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 13:53 #8
programina, ну по сути разницы нет, разве что для улучшения читабельности
1
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
07.11.2013, 14:04 #9
Цитата Сообщение от programina Посмотреть сообщение
было -7.678 стало -1.0, было 7.678 стало 1.0.
Может
было -7.678 стало -7.0, было 7.678 стало 7.0.
или что это за хрень?
1
I.M.
566 / 549 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 14:04 #10
могу предложить поколдовать с битами
C++
1
2
3
4
5
union foo
{
  float fvalue;
  int ivalue;
};
но выглядеть будет ужасно
чем варианты с условными операторами не угодили? неравная борьба за такты?)
2
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:08 #11
C++
1
2
    float R = -1.97043;
    float Q = -((float)((int32_t)R & 0x80000000 >> 30) - 1);
2
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:18  [ТС] #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..., то теряется знак.
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:28 #13
Да, ошибся.
C++
1
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
1
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:36  [ТС] #14
Цитата Сообщение от castaway Посмотреть сообщение
Да, ошибся.
C++
1
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
ideone.com не может вывести результат. И int32_t тот же самый int
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:39 #15
Лучший ответ Сообщение было отмечено как решение

Решение

Всё выводит. http://ideone.com/l4JoPM
1
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:50  [ТС] #16
Цитата Сообщение от castaway Посмотреть сообщение
Всё выводит. http://ideone.com/l4JoPM
здесь видно, но я захожу туда с телефона, видимо сайт зависает.
В общем задача не решена, но вам за необычное решение оставлю отзыв.
1
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 14:51 #17
Цитата Сообщение от programina Посмотреть сообщение
В общем задача не решена
Это рабочее решение. Проверено на цикле от -10.0 до 10.0 с маленьким шагом.
1
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
07.11.2013, 14:58 #18
Цитата Сообщение от castaway Посмотреть сообщение
Это рабочее решение. Проверено на цикле от -10.0 до 10.0 с маленьким шагом.
просто в условии было
Цитата Сообщение от programina Посмотреть сообщение
без преобразования типа в int?
0
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 15:14 #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
3
Jazz411
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 15:19 #20
SatanaXIII, что не ясно флоат к 1, как написано так и сделано
0
07.11.2013, 15:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2013, 15:19
Привет! Вот еще темы с решениями:

cannot convert `float' to `float*. Почему так происходит?
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра...

Неправильное приведение void* к *float а далее к float
Почему когда привожу void* к int* потом к int то все работает, данные не бьются...

округление printf("%.4f", (float) ans ); и printf("%.4lf", ans );
printf(&quot;%.4f&quot;, (float) ans ); printf(&quot;%.4lf&quot;, ans ); вроде по моему...

Дано натуральное число n. Отбросить в нем все цифры, стоящие правее самой правой единицы либо оставить число без изменений, если единицы в нем нет
Дано натуральное число n. Отбросить в нем все цифры, стоящие правее самой...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru