Форум программистов, компьютерный форум 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 15:27  [ТС]     Округление float до единицы #21
Вот так грубо

C++
#include <iostream>
#include <cmath>
using namespace std;
 
int main() {
 
  float R = 0.087;
 
  float Q = R;
 
  for(int i = 0; i < 1000; i++)
    Q *= 0.99;
 
  cout << 2 * ( ceil ( Q ) - 0.5 ) << endl;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.11.2013, 15:47     Округление float до единицы #22
Вот вариант подойдет =) :
C++
1
float f = long(f);
В int же не преобразуем)
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
07.11.2013, 15:52     Округление float до единицы #23
Как такое?)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool g(float a)
{
    return a > 0;
}
 
float f(float a)
{
    return  g(a) - g(-a);
}
 
int main()
{
    cout << f(-9.756456);
}
Толь с 0 не работает. 0 же нейтрален, сошлемся на это
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.11.2013, 16:08     Округление float до единицы #24
BumerangSP, а Вы знаете толк в извращениях

Добавлено через 10 минут
А как такой вариант, а?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <algorithm>
 
using namespace std;
 
 
int main()
{
    string s,s1;
    float f;
    cin>>s;
    for(int i =0;i<s.length() && s[i] != '.';++i)
        s1+=s[i];
    f=atof(s1.c_str());
    cout<<f<<endl;
    system("pause");
    return 0;
}
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
07.11.2013, 16:12     Округление float до единицы #25
ZaMaZaN4iK,

Не по теме:

фантазия вообще штука непредсказуемая)


По коду: Programine как бы нужно, чтобы выводилось только 1 или -1.
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
07.11.2013, 16:15     Округление float до единицы #26
Прошу прощения, не в ту степь понесло
programina
07.11.2013, 16:29  [ТС]
  #27

Не по теме:

Все такие с хитрицой немного...

BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
07.11.2013, 16:36     Округление float до единицы #28
programina, насколько этот код соответствует тому, что Вы хотели?
Кстати, здесь используется ceil, приводящий к int)
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
07.11.2013, 17:20     Округление float до единицы #29
C++
1
2
float R = -20392.213123;
float Q = ((R / R ) *  ((R > 0) * 2 - 1)); //Q = -1
Добавлено через 7 минут
C++
1
2
float R = -8293123;
float Q = R / (sqrt(R*R)); //Q = -1 //убиваем знак при помощи возведения в квадрат
опять же с нулем работать ничего не будет)
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
07.11.2013, 17:24     Округление float до единицы #30
Raali, в первой версии зачем R/R? Всегда же 1 будет. Кроме 0 конечно.

Мой код тоже можно переписать:
C++
1
2
float f = -9.756456;
float q = (f > 0) - (-f > 0);
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 18:21  [ТС]     Округление float до единицы #31
C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
 
float goo1(float D)
{
    if(D != 0.0) return 2*(ceil(D/10000.0)-0.5);
    else return 0.0;
}  
float goo2(float D)
{
    if(D != 0.0) return D/abs(D);
    else return 0.0;
}  
float goo3(float D)
{
    if(D != 0.0) return -((float)((*((int *)&D) >> 30) & 2) - 1);
    else return 0.0;
}  
float goo4(float D)
{
    if(D != 0.0) return (D > 0) - (-D > 0);
    else return 0.0;
} 
 
 
int main()
{
    srand(time(0));
    clock_t t;
    int N = 1000000000; // миллиард
    float *R = new float[N];
    for(int i = 0; i < N; i++) R[i] = (rand()%100-50)/100.0;
 
    // ===================
 
    t = clock(); // старт 
    for(int i = 0; i < N; i++) goo1(R[i]);
    t = clock() - t; // финиш
    cout << "goo1() => " << ((float)t)/CLOCKS_PER_SEC << endl;
 
    t = clock(); // старт 
    for(int i = 0; i < N; i++) goo2(R[i]);
    t = clock() - t; // финиш
    cout << "goo2() => " << ((float)t)/CLOCKS_PER_SEC << endl;
 
    t = clock(); // старт 
    for(int i = 0; i < N; i++) goo3(R[i]);
    t = clock() - t; // финиш
    cout << "goo3() => " << ((float)t)/CLOCKS_PER_SEC << endl;
 
    t = clock(); // старт 
    for(int i = 0; i < N; i++) goo4(R[i]);
    t = clock() - t; // финиш
    cout << "goo4() => " << ((float)t)/CLOCKS_PER_SEC << endl;
 
    // ===================
 
    delete [] R;
}
Это поразительно, способ castaway самый быстрый
Bash
goo1() => 13.3622
goo2() => 16.6615
goo3() => 9.32718
goo4() => 10.3528
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
07.11.2013, 18:22     Округление float до единицы #32
Цитата Сообщение от programina Посмотреть сообщение
Это поразительно, способ castaway самый быстрый
))Там, кстати, не нужна проверка на ноль
Хотя нет, нужна, иначе при 0 может дать результат -1
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 18:29  [ТС]     Округление float до единицы #33
Цитата Сообщение от castaway Посмотреть сообщение
))Там, кстати, не нужна проверка на ноль
Хотя нет, нужна, иначе при 0 может дать результат -1
Это удивительно, но с проверкой на ноль работает быстрее!!!

Добавлено через 2 минуты
Цитата Сообщение от programina Посмотреть сообщение
Это удивительно, но с проверкой на ноль работает быстрее!!!
ой вру!
BumerangSP
07.11.2013, 19:28
  #34

Не по теме:

Нуу, я думал, что все варианты будут подходить под изначальные критерии. Так неинтересно

programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
18.11.2013, 15:35  [ТС]     Округление float до единицы #35
Рылась в math.h и нашла кое что интересное. Дело в том, что есть такая замечательная функция как copysign.
C++
#include <cmath>
 
...
 
float x = -77.77;
float y =  1.0;
 
y = copysign(y, x); // y = -1.0
Добавлено через 23 минуты
А в с++11 появилась новая функция signbit, которая возвращает бит знака.
C++
signbit(-1.0); // 1
Добавлено через 1 минуту
не совсем функция, это макрос.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.11.2014, 00:04  [ТС]     Округление float до единицы #36
Цитата Сообщение от castaway Посмотреть сообщение
C++
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
Так еще быстрее:
C++
float Q = ((*(int*)&D >> 31) << 1) + 1;
Шах и мат!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 01:15     Округление float до единицы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
19.11.2014, 01:15     Округление float до единицы #37
round, ceil, floor
Yandex
Объявления
19.11.2014, 01:15     Округление float до единицы
Ответ Создать тему
Опции темы

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