Ох, уж, этот грязный и нечестный ... :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот, мужики, вот, ну ни чуточки не вру ...

Отошёл я значит немного от новогоднего отдыха и с остаточного бодуна на светлую, отдохнувшую голову понадобилось мне из одного целого числа другое вычесть, да так, чтобы результат во float получить. Ну, понятное дело, что я не лох какой, чтобы делать это на калькуляторе или, прости Господи, «столбиком» - что у меня ардуины что-ли не найдётся? Порылся, значить, где бы скетч скачать, не нашёл, пришлось как-то накорябать самому. Накорябал:

#define F1 1073741889L
#define F2 1073741888L

void setup(void) {
	Serial.begin(57600);
	const float df = (float)F1 - F2;
	Serial.print("F1 = "); Serial.println(F1);
	Serial.print("F2 = "); Serial.println(F2);
	Serial.print("df = "); Serial.println(df);
}

вроде, всё как у людей, два длинных целых, преобразовываю к float, вычитаю, получаю:

F1 = 1073741889
F2 = 1073741888
df = 128.00

Смотрю, хренею, протираю глаза и опять хренею ... протрезвел ажно. Попробовал вычесть их в уме, потом на калькуляторе, потом (только никому не говорите) «столбиком». Везде получается 1. А на ардуине - аж 128!

Ну, думаю, точно ардуина китайская! Мож у них в Китае 9 - 8 как раз 128 и получается, хрен же их узкоглазых знает! Попробовал на оригинальной итальянской ардуине ... не поверите (я и сам не поверил сначала), но та же хрень!

Тут до меня дошло! Это ж ейный абдуриновский язык нечестный! Вот ежели написать на честном, чистом, тёплом и ламповом С ... да ещё и в линухе, а не в каком-нибудь масдае ... то все калькуляторы можно смело выбрасывать!

Написал

#include <stdio.h>

#define F1 1073741889L
#define F2 1073741888L

void main(void) {
	const float f3 = (float)F1 - F2;
	printf("  %d\n- %d\n  ----------\n  %10.0f\n", F1, F2, f3);
}

результат

  1073741889
- 1073741888
  ----------
         128

Так это ж совсем другое дело! Так что мужики, дурят нас с этой абдуриной ... как лохов разводят! Знайте!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну это как с крокодилами

Вовочка отвечает на уроке биологии:
- Длина крокодила от головы до хвоста - 5 метров, а от хвоста до головы - 7 метров...
- Подумай, что ты говоришь, - перебивает Вовочку учитель. - Разве так бывает?
- Бывает, - отвечает Вовочка. - Например, от понедельника до среды - два дня, а от среды до понедельника - пять!

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:

с крокодилами

И чё? Это как-то оправдывает абдурину? Как жить-то, блин? Куда бежать, православные?

negavoid
Offline
Зарегистрирован: 09.07.2016

О ужас, на винде так же. Что доказывает, что все операционки - говно. :)))

const double f3 = (double)F1 - F2;

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, интересное дело:

#define F1 1073741889L
#define F2 1073741888L

void setup(void) {
  Serial.begin(115200);
  const float f1 = (float)F1;
  const float f2 = (float)F2;
  const float df = (float)f1 - f2;
  Serial.print("f1 = "); Serial.println(f1);
  Serial.print("f2 = "); Serial.println(f2);
  Serial.print("df = "); Serial.println(df);
}

Даёт:

f1 = 1073741952.00
f2 = 1073741824.00
df = 128.00

Разрядности не хватает что ли?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, ТС же сказал - либо ардуина китайская, либо С нечестный. Первое он же и исключил :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак итальянцы - те же цыгане. Могут и китайскую ардуину продать под видом европейской.

Отсюда проблемы начинаются:

16777221 => 16777220.00
16777220 => 16777220.00
16777219 => 16777220.00
16777218 => 16777218.00
16777217 => 16777216.00
16777216 => 16777216.00
16777215 => 16777215.00
16777214 => 16777214.00
16777213 => 16777213.00
16777212 => 16777212.00
16777211 => 16777211.00
16777210 => 16777210.00
16777209 => 16777209.00

....

Мотематики свинью подложили, а не китайцы. Числа свои дурацкие не могут нормально в православный float положить.

--------------

16777216 is exactly 224, and would be represented as 32-bit float like so:

  • sign = 0 (positive number)
  • exponent = 24 (stored as 24+127=151=10010111)
  • mantissa = .0
  • As 32 bits floating-point representation: 0 10010111 00000000000000000000000
  • Therefore: Value = (+1) * 2^24 * (1.0 + .0) = 2^24 = 16777216

Now let's look at the number 16777217, or exactly 224+1:

  • sign and exponent are the same
  • mantissa would have to be exactly 2-24 so that (+1) * 2^24 * (1.0 + 2^-24) = 2^24 + 1 = 16777217
  • And here's the problem. The mantissa cannot have the value 2-24 because it only has 23 bits, so the number 16777217 just cannot be represented with the accuracy of 32-bit floating points numbers!

--------------

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Мотематики свинью подложили, а не китайцы. 

А математики точно не китайские? Может, они "в одном флаконе"? :-)

Волшебник
Онлайн
Зарегистрирован: 22.12.2016
#include <stdio.h>

#define F1 1073741893L
#define F2 1073741888L

int main(void)
{
    //const
//    float f3 = ((float)F1) - ((float)F2);
  const double f3 = ((double)F1) - ((double)F2);
    printf("  %d\n- %d\n  ----------\n  %10.0f\n", F1, F2, f3);

  return 0;
}

build-test-float-Desktop_76ce63-Debug/test-float...

1073741893

- 1073741888

----------

5

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:

Мотематики свинью подложили, а не китайцы. 

А математики точно не китайские? Может, они "в одном флаконе"? :-)

Математики во всяких умных статьях из интернетов издревле индийские были. Но сейчас, да - начали китайские фамилии появляться. Наверное, в Китае уже налажен выпуск аналогов. Так что не могу не согласиться - определённо пахнет  包子 от всего этого.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Петрович, честно, от тебя такого не ожидал. Сам же говоришь: не стесняйтесь расставлять скобки:

const float df = (float)(F1 - F2);

Ну заодно и вычисляться быстрее будет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Петрович, честно, от тебя такого не ожидал. Сам же говоришь: не стесняйтесь расставлять скобки:

const float df = (float)(F1 - F2);

Ну заодно и вычисляться быстрее будет.

и зачем так рано тему слили )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

Петрович, честно, от тебя такого не ожидал. Сам же говоришь: не стесняйтесь расставлять скобки:

const float df = (float)(F1 - F2);

Ну заодно и вычисляться быстрее будет.

Нещитова!

Я ж сказал, что нужен результат во float, а Вы чо написали? Вы получаете промежуточный результат в long. Получение промежуточных результатов задача не предусматривала! Нещитова! :-)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

и зачем так рано тему слили )))

Что значит слили? Нормальное типа "обсуждение" :-)

Или кто-то эту тему не как шутку воспринял? Вы там эта ... пора выходить из праздников!

agnec2001
Offline
Зарегистрирован: 08.11.2019

слили ещё в 6 посте

And here's the problem.

sadman41
Offline
Зарегистрирован: 19.10.2016

Сорри, бразерс, я не специально, а проехался по инерции, газуя из"песочницы"...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На самом деле по мне так, самое забавное во флоатах, это когда выражение a != a получается истинным. Вот это действительно доставляет. Пример был в этюде про float.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Ну, проверять float на (не)равентсво - идея так себе... :-)    Наерна. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дык, дида, я понимаю, что сравнивать две переменные. С ними всё понятно, вычислялись по разному и в ХЗ каком знаке отличаются. Но речь то идёт об одной переменной! Саму с собой сравниваешь и ... не равна сцуко! Когда я первый раз с этим столкнулся, до того вштырило ... давненько, правда, прошли времена, когда для меня это было удивительной новостью ... как поэт говорил: "отцвели каштаны, выросли друзья, и в моей причёске поменялось что-то" :-(

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

А я уже ничему не дывлюся в этом языке. Он тока у Онкеля чесный, видимо, он слова знает какие. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак ему святой ассемблер и Атмел студио все фиксят в аутоматическом режиме.