2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

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

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

Студворк — интернет-сервис помощи студентам
Например есть число с плавающей точкой. Как его превратить в единицу без преобразования типа в int?
Желательно без использования условных операторов.
например:
C++
float R = -1.97043;
 
float Q = foo(R); // Q = -1.0
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2013, 13:25
Ответы с готовыми решениями:

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

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

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

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

36
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.11.2013, 13:36 2
Цитата Сообщение от programina Посмотреть сообщение
Как его превратить в единицу без преобразования типа в int?
float f = 1;
2
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
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
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:44  [ТС] 4
castaway, Raali, не то. Знак должен сохраняться. То есть было -7.678 стало -1.0, было 7.678 стало 1.0.
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 13:46 5
C++
1
Q = R > 0? R / R : R / -R;
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
07.11.2013, 13:48 6
C++
1
Q = R / abs(R);
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 13:51  [ТС] 7
Jazz411, а без условных операторов?

Добавлено через 2 минуты
Цитата Сообщение от Raali Посмотреть сообщение
C++
1
Q = R / abs(R);
abs() - это тот же условный оператор, но завернутый в функцию.
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 13:53 8
programina, ну по сути разницы нет, разве что для улучшения читабельности
1
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
07.11.2013, 14:04 9
Цитата Сообщение от programina Посмотреть сообщение
было -7.678 стало -1.0, было 7.678 стало 1.0.
Может
было -7.678 стало -7.0, было 7.678 стало 7.0.
или что это за хрень?
1
575 / 558 / 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
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.11.2013, 14:08 11
C++
1
2
    float R = -1.97043;
    float Q = -((float)((int32_t)R & 0x80000000 >> 30) - 1);
2
2062 / 618 / 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
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.11.2013, 14:28 13
Да, ошибся.
C++
1
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
1
2062 / 618 / 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
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.11.2013, 14:39 15
Лучший ответ Сообщение было отмечено как решение

Решение

Всё выводит. http://ideone.com/l4JoPM
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 14:50  [ТС] 16
Цитата Сообщение от castaway Посмотреть сообщение
Всё выводит. http://ideone.com/l4JoPM
здесь видно, но я захожу туда с телефона, видимо сайт зависает.
В общем задача не решена, но вам за необычное решение оставлю отзыв.
1
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.11.2013, 14:51 17
Цитата Сообщение от programina Посмотреть сообщение
В общем задача не решена
Это рабочее решение. Проверено на цикле от -10.0 до 10.0 с маленьким шагом.
1
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
07.11.2013, 14:58 18
Цитата Сообщение от castaway Посмотреть сообщение
Это рабочее решение. Проверено на цикле от -10.0 до 10.0 с маленьким шагом.
просто в условии было
Цитата Сообщение от programina Посмотреть сообщение
без преобразования типа в int?
0
Эксперт С++
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
07.11.2013, 15:19 20
SatanaXIII, что не ясно флоат к 1, как написано так и сделано
0
07.11.2013, 15:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2013, 15:19
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru