Login
float в java
NEW 29.05.08 11:02
in Antwort Murr 27.05.08 13:26
Странно, но следующий код работает тоже не так, как я ожидал.
double d1 = Double.MAX_VALUE;
double d2 = d1-0.1;
long lon1 = Double.doubleToLongBits(d1);
long lon2 = Double.doubleToLongBits(d2);
System.out.println(lon1 == lon2);
Последнее выражение возвращает TRUE. Я то думал, что раз битовые представления d1 и d2 отличаются, то это должно отразиться и на значениях lon1 и lon2.
double d1 = Double.MAX_VALUE;
double d2 = d1-0.1;
long lon1 = Double.doubleToLongBits(d1);
long lon2 = Double.doubleToLongBits(d2);
System.out.println(lon1 == lon2);
Последнее выражение возвращает TRUE. Я то думал, что раз битовые представления d1 и d2 отличаются, то это должно отразиться и на значениях lon1 и lon2.
http://denis-aristov.ucoz.com
NEW 29.05.08 11:08
in Antwort kashej 29.05.08 11:02
Все то же самое, об чем тебе уже не раз писали в разной форме.
Разберись с тем, как хранится float...
Разберись с тем, как хранится float...
NEW 29.05.08 11:11
in Antwort Murr 29.05.08 11:08
Так в том то и дело, что времени на разбор нет. Хотелось бы подходящую библиотеку где-нибудь взять...
http://denis-aristov.ucoz.com
NEW 29.05.08 11:38
in Antwort kashej 29.05.08 11:11
Ладно, сжалюсь
Твоя проблема в том что ты отнимаешь от первого числа второе второе меньше чем точность представления первого.
Приведу пример:
a=1.2345
b=0.000001
Числа при этом имеют определённую точность представления (float, ,double, ...)
Если эта точность к примеру три знака, то грубо говоря ВСЕ ЧИСЛА от 1.234 до 1.236 представлены в памяти компа ОДИНАКОВО как 1.235
Именно поэтому при вычитании числа которое меньше точности представления первое число НЕ МЕНЯЕТСЯ.
На самом деле всё немного сложнее - там двоичное представление и степень двойки.
Но принцип не меняется - каждый тип с плавающей точкой имеет кроме границ (максимальное число
представимое этим типом) ещё и точность представления (типа число знаков после запятой).
Так понятней?

Твоя проблема в том что ты отнимаешь от первого числа второе второе меньше чем точность представления первого.
Приведу пример:
a=1.2345
b=0.000001
Числа при этом имеют определённую точность представления (float, ,double, ...)
Если эта точность к примеру три знака, то грубо говоря ВСЕ ЧИСЛА от 1.234 до 1.236 представлены в памяти компа ОДИНАКОВО как 1.235
Именно поэтому при вычитании числа которое меньше точности представления первое число НЕ МЕНЯЕТСЯ.
На самом деле всё немного сложнее - там двоичное представление и степень двойки.
Но принцип не меняется - каждый тип с плавающей точкой имеет кроме границ (максимальное число
представимое этим типом) ещё и точность представления (типа число знаков после запятой).
Так понятней?
NEW 29.05.08 11:53
in Antwort kashej 29.05.08 11:11
Хотелось бы подходящую библиотеку где-нибудь взять...
-----
Хммм... Ну это врядли... Если только не адаптируешь один из моих курсовиков - там как раз был имплементирован эмулятор четырех операций над псевдо-флоат с переменным размером... Правда для этого придется освоить Фортран-4 для СМ-1...
-----
Хммм... Ну это врядли... Если только не адаптируешь один из моих курсовиков - там как раз был имплементирован эмулятор четырех операций над псевдо-флоат с переменным размером... Правда для этого придется освоить Фортран-4 для СМ-1...

NEW 29.05.08 11:56
in Antwort katran76 29.05.08 11:38
я эту мысль пытался до автора еще 2 недели назад донести... но, видимо, ява-программисты - очень занятой народ, им не до таких пустяков...
NEW 29.05.08 12:06
in Antwort katran76 29.05.08 11:38
Если эта точность к примеру три знака, то грубо говоря ВСЕ ЧИСЛА от 1.234 до 1.236 представлены в памяти компа ОДИНАКОВО как 1.235
-----
Вообще-то ТРИ знака это 1.23
На самом деле всё немного сложнее
-----
Да, float-числа хранятся в нормализованном виде - т.е. мантиса 0.123 и порядок 1 (10^1)
Кроме этого, во многих системах учитывается, что старший разряд нормальзованной мантисы всегда единца (двоичная) и потому он опускается.
Кроме этого - описанное представление - не единственно возможное. В Коболе и ПЛ/1 используются типы DECIMAL(?) весьма похожие на float, но имеющие принципиально иное представление - упакованных или распакованный двоично-десятичный код. Мало того, так еще и имплементация этих децималов в разных системах отличается...
-----
Вообще-то ТРИ знака это 1.23
На самом деле всё немного сложнее
-----
Да, float-числа хранятся в нормализованном виде - т.е. мантиса 0.123 и порядок 1 (10^1)
Кроме этого, во многих системах учитывается, что старший разряд нормальзованной мантисы всегда единца (двоичная) и потому он опускается.
Кроме этого - описанное представление - не единственно возможное. В Коболе и ПЛ/1 используются типы DECIMAL(?) весьма похожие на float, но имеющие принципиально иное представление - упакованных или распакованный двоично-десятичный код. Мало того, так еще и имплементация этих децималов в разных системах отличается...

NEW 29.05.08 12:32
in Antwort Murr 29.05.08 12:06
вообще то точность измеряется числом значащих знаков после запятой в нормализованном представлении.
Так что 1.234=1.234*10^1 это всё-таки ТРИ
По стандарту (если я его правильно помню) числа (как мантисса так и порядок) хранится в двоичном виде, т.е. не 0.125 а что то-типа
десятичное 0.125 = 2^(-3) = двоичное 0.001= двоичное нормализованное 1.0*2(-3)
Я поэтому и написал что на самом деле всё "немного сложнее"
Однако к вопросу автора это имеет отдалённое отношение...
Главное для него - точность нормализованного представления
Так что 1.234=1.234*10^1 это всё-таки ТРИ

В ответ на:
Да, float-числа хранятся в нормализованном виде - т.е. мантиса 0.123 и порядок 1 (10^1)
Да, float-числа хранятся в нормализованном виде - т.е. мантиса 0.123 и порядок 1 (10^1)
По стандарту (если я его правильно помню) числа (как мантисса так и порядок) хранится в двоичном виде, т.е. не 0.125 а что то-типа
десятичное 0.125 = 2^(-3) = двоичное 0.001= двоичное нормализованное 1.0*2(-3)
Я поэтому и написал что на самом деле всё "немного сложнее"

Однако к вопросу автора это имеет отдалённое отношение...
Главное для него - точность нормализованного представления
NEW 29.05.08 12:54
in Antwort katran76 29.05.08 12:32
в нормализованном представлении.
-----
В нормализованном представлении перед точкой нет значащих цифр - там только ноль, и в том же нормализованном предствлении цифирька после точки - не ноль. Таково, понимаешь, нормализованное представление.
Так что 1.234=1.234*10^1 это всё-таки ТРИ
-----
Четыре. Кроме этого - 1.234*10^1 = 12.34 - умножение на порядок надо реально выполнять...
По стандарту
-----
По какому из стандартов? И как этот стандарт учитывает наличие арифметических со-процессоров берущих на себя операции с флоат-типами... при двух условиях - первое - что он установлен в системе, второе - что софт знает как его использовать...
Вообщем - не заморачивайся - определяется фактической реализацией в конкретном трансляторе. Обычно опирается на аппаратные особенности системы, но может и эмулироваться.
Главное для него - точность нормализованного представления
-----
Не только. Еще существенно как именно производится операция - с денормализацией (сложение и вычитание) мантисы или без (умножение, деление, степени)... Будет понимать как это хранится и как производится операция - не будет задавать смешных вопросов... и не на чем нам будет флудераствовать...
-----
В нормализованном представлении перед точкой нет значащих цифр - там только ноль, и в том же нормализованном предствлении цифирька после точки - не ноль. Таково, понимаешь, нормализованное представление.
Так что 1.234=1.234*10^1 это всё-таки ТРИ
-----
Четыре. Кроме этого - 1.234*10^1 = 12.34 - умножение на порядок надо реально выполнять...
По стандарту
-----
По какому из стандартов? И как этот стандарт учитывает наличие арифметических со-процессоров берущих на себя операции с флоат-типами... при двух условиях - первое - что он установлен в системе, второе - что софт знает как его использовать...
Вообщем - не заморачивайся - определяется фактической реализацией в конкретном трансляторе. Обычно опирается на аппаратные особенности системы, но может и эмулироваться.
Главное для него - точность нормализованного представления
-----
Не только. Еще существенно как именно производится операция - с денормализацией (сложение и вычитание) мантисы или без (умножение, деление, степени)... Будет понимать как это хранится и как производится операция - не будет задавать смешных вопросов... и не на чем нам будет флудераствовать...
NEW 29.05.08 14:32
in Antwort AlexOtt 29.05.08 13:12
NEW 29.05.08 14:57
in Antwort Murr 29.05.08 14:32
а где сейчас СМ можно взять? точнее я знаю где ее можно найти, но боюсь, что мне ее не дадут запустить
NEW 29.05.08 15:24
in Antwort AlexOtt 29.05.08 14:57
а где сейчас СМ можно взять?
-----
Взять, скорее всего, не дадут - там порядка двух унций золота на разъемах...
А так... хммм... на производственной оборонке, в АСУ ТП, вполне может быть...
Заодно - СМ-1 - это не линия PDP-11, а вполне самостоятельная наработка...
-----
Взять, скорее всего, не дадут - там порядка двух унций золота на разъемах...
А так... хммм... на производственной оборонке, в АСУ ТП, вполне может быть...
Заодно - СМ-1 - это не линия PDP-11, а вполне самостоятельная наработка...
NEW 29.05.08 16:34
in Antwort Murr 29.05.08 15:24
где они до сих пор работают я прекрасно знаю - я в свое время на практически всей линейке успел поработать