числа с плавающей точкой. равно ли 2.0 и 2?

kruzer25

pow(x, 2./3) на sqr(cbrt(x.
А ничего, что pow(x, 2.) не равно sqr(x)?

danilov

Может, ключевое слово было "некоторые"? Или оптимизация не включена (если она опциональна. попробуй -О3 вроде, если нет, то man gcc)

Elina74

ты путаешь sqr и sqrt

kruzer25

Я не путаю, и дело не в этом ;)

danilov

А в чём? Вижу разницу тока в типах, но ясно-понятно, что имелось ввиду double

kruzer25

2.0 не равно 2, и 2^2.0 не равно sqr(2) (которое, в свою очередь, вроде как, необязательно равно 4).

danilov

Как по-твойму записываются чилса с плавающей запятой?

yolki

хочу тебя огорчить, 2.0 равно 2

danilov

я бы больше беспокоился, что pow(x, 1.0/3) != cbrt(x)
Но, думается cbrt(x) в таких случаях всегда лучше отражает желаение программиста (то бишь, хотел он именно кубического корня, в не возведения в степень 1.0/3)
К тому же разница вряд ли сильно ощутится.

kruzer25

Числа ведь хранятся не как x*(2^y 1<=x<2, а как x*(e^y 1<=x<e, y целое ;)

okunek

понятие "экспонента" в записи чисел с плавающей точкой означает не e^blabla :grin:

SCIF32

и чему равно e?

kruzer25

Уж точно не двойке.

kruzer25

А что означает?

okunek

хорошо, начнем с того, что ты понимаешь под:
> Числа ведь хранятся
где хранятся?

kruzer25

В памяти

SCIF32

правильно, не двойке.
так чему же оно равно?

kruzer25

Магической константе e :p
Говорят, она где-то между двойкой и тройкой... но это всё только слухи, а своими глазами её никто никогда не видел...

Elina74

мне вот компутер выдал число
1.5е3
это сколько?

kruzer25

Он тебе перевёл в десятичную систему счисления...

kruzer25

Бля, ладно, уговорили, e=2.

SCIF32

а не 10? :confused:

conv3rsje

Пипец :)
Раньше число Е продавали отдельно и называли микросхему с ним "сопроцессор"
На самом деле там просто в еепроме было вшито число :)
Как видно из п2шных постов, не зная этого числа нельзя считать плавающую арифметику
Поэтому без этого сопроцессора она не работала
Сейчас времена не те, и FPU встраивают в проц. Но все равно, отдельным блоком!
Самые крутые производители не жадничают и хранят 2048 знаков числа Е
Всякие transmeta и via халявят, у них в FPU всего 1024 знака
вот :)

okunek

найди в гугле описание формата чисел с плавающей точкой, которым оперирует ia-32 (как минимум)
и все сразу станет ясно

Elina74

уговорили, [math][res=150]$$e=2\pm10$$[/math]

kruzer25

Не 10, а 8 :smirk:

conv3rsje

гоню ;)

kruzer25

Точнее, не 8, а 4.
И не 2, а 6.
:smirk:

SCIF32

короче,
http://steve.hollasch.net/cgindex/coding/ieeefloat.html
E=10 (имеется ввиду запись при станд выводе)
хранится все как степени двойки,
IEEE 754 наиболее распространен в реализациях fp.

Elina74

ну, это очень строгая оценка, а я сделал скидку на будущие, еще неизвестные нам системы, вдруг советская пищущая машинка станет прообразом новой, 12-ричной вычислительной машинищи?

sbs-66

Бля, пенартур, не пиши сюда больше.
А то я умру от смеха.

yolki

отличная ссылка.
буду студентам давать.

kruzer25

На этот тред тоже давай :o

yolki

ок, поиск по ключевым словам:

уговорили, e=2.

xronik111

И еще вот эту ссылку не помешает.

bleyman

Пенартур милый, он приносит нам радость!

SCIF32

>милый
ахтунг!

Elina74

до контры ему далеко, но он успешно осваивает освободившуюся нишу... дело контры живо!

bleyman

Неее!
Контра был круче!
Споров подобную фигню он
а) попытался бы перевести разговор на какую-нибудь слабо связанную тему, в контексте которой его утверждение уже не было бы однозначно ложным (например, на какую-нибудь кроссплатформенность, где Всё Может Быть Не Так).
б) когда кто-нибудь через сотню постов припёр бы его к стенке и заставил вернуться к оригинальному утверждению, он некоторое время туманно порассуждал бы о том, что все люди делают ошибки, и, наконец, упрекнул бы оппонента в том, что тот тупой или троллит, потому что и так понятно, что то утверждение неверно.

bleyman

А ещё Контра всё-таки был умней намного и иногда говорил интересные вещи!

voch

в языках со строгой типизацией 2.0 и 2 нельзя просто так сравнивать, потому что это объекты РАЗНЫХ типов.
Можно попробовать привести один тип к другому и тогда уже о чем-то говорить.
Кстати, в общем случае, для чисел с плавающей точкой не существует операции проверки равенства.
Вместо неё применяется попадание одной точки в окрестность (задаваемую программистом) другой.

yolki

Плюсы - это язык с нестрогой типизацией.
так что на равенство сравнивать можно.
студенты даже придумывают такие крокодилы:

if(x<=y && x>=y) ...

ибо

if(x==y) ..

выдаёт warning, а в дисплейных классах на ММ в компиляторе включен флажок "threat warnings as errors", который не отключается. посему из исходника с варнингами экзешника не получается. вот и изгаляются.

Elina74

if(x==y) ..
лучше бы писали if(fabs(x-y)<1e-6) или что-то типа

Olenenok

/usr/bin/gcc :grin:
я так делал. Правда, уже на 3-м курсе.

freezer

выдаёт warning, а в дисплейных классах на ММ в компиляторе включен флажок "threat warnings as errors", который не отключается. посему из исходника с варнингами экзешника не получается. вот и изгаляются.
#pragma warning (disable : xxxx)
:confused:

SPARTAK3959

В GCC такой прагмы, на сколько мне известно, нет.
PS Лично я считаю, что пока преподы не соберут все программы (в том числе ядро которые стоят в этих классах с этим флагом, они не имеют морального права мучить этим студентов.

geja_03

Единственный напряг с этими ворнингами это "No new line at the end of file". Остальные ворнинги разумны по своей природе. И вообще ненормально писать a == b для float/double.

freezer

в GCC можно эти ворнинги выключить в командной строке (-w)

conv3rsje

PS Лично я считаю, что пока преподы не соберут все программы (в том числе ядро которые стоят в этих классах с этим флагом, они не имеют морального права мучить этим студентов.
Студент существо ленивое и глупое. И само не будет включать -Wall -Werror. А зря. Поэтому преподы включат сами.
Оставить комментарий
Имя или ник:
Комментарий: