2015-06-11 7 views
0

Я решал эту проблему на spoj http://www.spoj.com/problems/ATOMS/. Я должен был представить интегральную часть log (m/n)/log (k) в качестве вывода. Я долго ждал m, n, k. Когда я вычислял это с использованием длинных удвоений, я получал неправильный ответ, но когда я использовал float, это было принято.Поплавок лучше, чем двойной, иногда?

printf("%lld\n", (long long)(log(m/(long double)n)/log(k))); 

Это дает неправильный ответ, но это:

printf("%lld\n", (long long)((float)log(m/(float)n)/(float)log(k))); 

получил принято. Таким образом, существуют ситуации, когда поплавок лучше, чем двойной по отношению к точности?

+5

Это не значит, что 'float' лучше, чем' double'. Вы должны учитывать ошибки округления при преобразовании числа с плавающей запятой в целое число. Это не так просто, как отбросить его. –

+0

Как безопасно преобразовать число с плавающей запятой в целое число? @ The Paramagnetic Croissant – In78

ответ

2

float является никогда больше точным, чем double, так как первый должен быть подмножеством последнего, в соответствии со стандартом C:

6.2.5/6: «Множество значений типа поплавка является подмножеством множества значений типа double, множество значений типа double является подмножеством набора значений типа long double. "

Обратите внимание, что стандарт не настаивает на конкретном представлении с плавающей точкой, хотя IEEE754 особенно распространен.

1

double всегда будет давать вам больше точности, чем поплавок. С двойным, вы кодируете число с использованием 64 бит, в то время как вы используете только 32 бит с поплавком.

Редактировать: Как сказал Йенс, это может быть не так. double даст более высокую точность, только если компилятор использует IEEE-754. Это относится к GCC, Clang и MSVC. Я еще не столкнулся с компилятором, который не использовал 32 бита для поплавков и 64 бит для удвоения, хотя ...

+4

Это неправильно. Удвои и поплавки могут использовать одинаковое количество бит (то есть быть неразличимым), и они не должны быть кратными 32. Не экстраполируйте одну из реализаций, которые вам знакомы :-) – Jens

+0

Это правда. Это только тот случай, если компилятор соответствует IEEE-754. Я никогда не сталкивался с компилятором, которого не было. – Jouan

1

В некоторых случаях может быть лучше в плане вычисления времени/пространства. Один пример, который находится прямо на моей стороне - микроконтроллер на базе ARM Cortex-M4F, имеющий аппаратный модуль с плавающей точкой (FPU), способный работать с арифметикой с одной точностью, но не с двойной точностью, что дает невероятное увеличение вычислений с плавающей запятой.

1

Попробуйте этот простой код:

#include<stdio.h> 
int main(void) 
{ 
    float i=3.3; 
    if(i==3.3) 
     printf("Equal\n"); 
    else 
     printf("Not Equal\n"); 
    return 0; 
} 

Теперь попробуйте то же самое с двойным, как тип данных I.

+0

При всем уважении ... код хорошо работает без редактирования. – SoumyadeepB

+1

«работает»! = «Правильно» –

+0

«хорошо работает» == «правильно» – SoumyadeepB