1 | |
Округление float до единицы07.11.2013, 13:25. Показов 2770. Ответов 36
Метки нет Все метки)
(
Например есть число с плавающей точкой. Как его превратить в единицу без преобразования типа в int?
Желательно без использования условных операторов. например: C++ float R = -1.97043; float Q = foo(R); // Q = -1.0
0
|
|
07.11.2013, 13:25 | |
Ответы с готовыми решениями:
36
Округление после запятой float Округление при преобразовании float в int опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
|
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
|
07.11.2013, 15:52 | 23 | |||||
Как такое?)
![]()
1
|
Мой лучший друг-отладчик!
|
||||||
07.11.2013, 16:08 | 24 | |||||
BumerangSP, а Вы знаете толк в извращениях
![]() Добавлено через 10 минут А как такой вариант, а? ![]()
1
|
programina
|
07.11.2013, 16:29
[ТС]
#27
|
Не по теме: Все такие с хитрицой немного...:jokingly:
0
|
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|||||||||||
07.11.2013, 17:20 | 29 | ||||||||||
1
|
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; } Bash goo1() => 13.3622 goo2() => 16.6615 goo3() => 9.32718 goo4() => 10.3528
0
|
BumerangSP
|
07.11.2013, 19:28
#34
|
Не по теме: Нуу, я думал, что все варианты будут подходить под изначальные критерии. Так неинтересно :)
0
|
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 А в с++11 появилась новая функция signbit, которая возвращает бит знака. C++ signbit(-1.0); // 1 не совсем функция, это макрос.
1
|
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
|
|
19.11.2014, 01:15 | 37 |
round, ceil, floor
0
|
19.11.2014, 01:15 | |
19.11.2014, 01:15 | |
Помогаю со студенческими работами здесь
37
Чем отличаются float преобразования (float)var от float(var) Неправильное приведение void* к *float а далее к float cannot convert `float' to `float*. Почему так происходит? invalid types `float[float]' for array subscript Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |