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

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

07.11.2013, 13:25. Показов 2701. Ответов 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
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 15:27  [ТС] 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;
}
0
Мой лучший друг-отладчик!
165 / 165 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
07.11.2013, 15:47 22
Вот вариант подойдет =) :
C++
1
float f = long(f);
В int же не преобразуем)
1
4297 / 1419 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
07.11.2013, 15:52 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 же нейтрален, сошлемся на это
1
Мой лучший друг-отладчик!
165 / 165 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
07.11.2013, 16:08 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;
}
1
4297 / 1419 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
07.11.2013, 16:12 25
ZaMaZaN4iK,

Не по теме:

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


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

Не по теме:

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

0
4297 / 1419 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
07.11.2013, 16:36 28
programina, насколько этот код соответствует тому, что Вы хотели?
Кстати, здесь используется ceil, приводящий к int)
0
858 / 447 / 112
Регистрация: 06.07.2013
Сообщений: 1,494
07.11.2013, 17:20 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 //убиваем знак при помощи возведения в квадрат
опять же с нулем работать ничего не будет)
1
4297 / 1419 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
07.11.2013, 17:24 30
Raali, в первой версии зачем R/R? Всегда же 1 будет. Кроме 0 конечно.

Мой код тоже можно переписать:
C++
1
2
float f = -9.756456;
float q = (f > 0) - (-f > 0);
1
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 18:21  [ТС] 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
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
07.11.2013, 18:22 32
Цитата Сообщение от programina Посмотреть сообщение
Это поразительно, способ castaway самый быстрый
))Там, кстати, не нужна проверка на ноль
Хотя нет, нужна, иначе при 0 может дать результат -1
1
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
07.11.2013, 18:29  [ТС] 33
Цитата Сообщение от castaway Посмотреть сообщение
))Там, кстати, не нужна проверка на ноль
Хотя нет, нужна, иначе при 0 может дать результат -1
Это удивительно, но с проверкой на ноль работает быстрее!!!

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

Не по теме:

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

0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
18.11.2013, 15:35  [ТС] 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 минуту
не совсем функция, это макрос.
1
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.11.2014, 00:04  [ТС] 36
Цитата Сообщение от castaway Посмотреть сообщение
C++
float Q = -((float)((*((int32_t *)&R) >> 30) & 2) - 1);
Так еще быстрее:
C++
float Q = ((*(int*)&D >> 31) << 1) + 1;
Шах и мат!
0
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
19.11.2014, 01:15 37
round, ceil, floor
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2014, 01:15
Помогаю со студенческими работами здесь

Чем отличаются 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) ...


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

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

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