Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / отбросить дробную часть / 25 сообщений из 30, страница 1 из 2
16.04.2013, 16:16
    #38227823
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Доброго времени суток.
Столкнулся с проблемой изменения данных в float.
например:
в функцию передаются параметры 0.3,0.1,0.1 и получается арифметическое выражение
Код: plaintext
1.
int mas_size;mas_size=(0.4-0.1)/0.1


однако в качестве результата я получаю не 3, а 2.
Решил сделать как было делал в делфи
Код: pascal
1.
mas_size:=trunc(0.4*1000)/1000// где 1000 это 10^количество необходимых знаков

Однако, функции trunc в builder 6.0 я не нашел.
Были найдены ceil и floor, но эти функции не подходят, тк они отбрасывают дробную часть изменяя при этом целой части=(
Пробовал так же
Код: plaintext
1.
int mas_size;mas_size=(((int)(0.4*1000)-(int)(0.1*1000))/(int)(0.1*1000))


однако, результат не изменился, подскажите пожалуйста решение, заранее спасибо
ПС я понял что дело в мусоре из-за плавающей точки, но как его победить не понял
...
Рейтинг: 0 / 0
16.04.2013, 16:23
    #38227838
отбросить дробную часть
Врешь ты всё:
http://ideone.com/KcQfwm
вывод 3
...
Рейтинг: 0 / 0
16.04.2013, 16:29
    #38227846
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Врешь ты всёВрешь ты всё:
http://ideone.com/KcQfwm
вывод 3
Быть может звезды сложились не так и дева в водолее...
Однако все именно так как я написал.
В функцию задаются вещественные значения, а при вычислении 0.1 волшебным образом превращается в 0.10000000024326, как следствие все дальнейшие расчеты идут лесом
...
Рейтинг: 0 / 0
16.04.2013, 16:39
    #38227862
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
проверил в консольном приложении MS VS 2005 express результат 3....
Что же с билдером то делать, как его лечить?=(
...
Рейтинг: 0 / 0
16.04.2013, 16:42
    #38227865
отбросить дробную часть
ииихВрешь ты всёВрешь ты всё:
http://ideone.com/KcQfwm
пропущено...

Быть может звезды сложились не так и дева в водолее...
Однако все именно так как я написал.
В функцию задаются вещественные значения, а при вычислении 0.1 волшебным образом превращается в 0.10000000024326, как следствие все дальнейшие расчеты идут лесом
Я чето тоже не нашел такого округления.
Странно, что её нету в стандартной библиотеке, хотя на x86 в FPU есть ассемблерная fstoi.
Можно написать самому простейшую функцию round:
http://ideone.com/rmLZZc
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include<iostream>
 
inline int round(float f) { return (f > 0)?(f+.5f):(f-.5f); }
 
int main() {
    int mas_size;mas_size=round((0.4-0.1)/0.1);
    std::cout << mas_size;    
    
    return 0;
}



Но если у вас десятичные дроби и C++11, то используйте десятичные дроби :)
http://www.cplusplus.com/reference/ratio/ratio/
...
Рейтинг: 0 / 0
16.04.2013, 16:43
    #38227867
отбросить дробную часть
ииихпроверил в консольном приложении MS VS 2005 express результат 3....
Что же с билдером то делать, как его лечить?=(
Поставить последнюю версию XE3 и использовать компилятор BCC64(Clang).
...
Рейтинг: 0 / 0
16.04.2013, 16:55
    #38227893
отбросить дробную часть
десятичные дроби и C++11 на x86 в FPU есть ассемблерная fstoi.
Точнее: fistpl
...
Рейтинг: 0 / 0
16.04.2013, 16:56
    #38227897
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
У меня нет ноутбука, и если преподаватель возжелает, чтобы я внес какие-то изменения в код компилировать придется именно на builder, тк там нет иного=(
...
Рейтинг: 0 / 0
17.04.2013, 10:47
    #38228657
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Самое забавное, что тот же код который у меня написан перенесенный в консольную версию на Visual Studio 2005 Express отрабатывает верно оО.
П.С. Всем кто пытался помочь спасибо, буду пытаться доказать преподу, что я не верблюд, а во всем виноват builder=(
П.С.2 пробовал поменять в ключевых позициях float на double,так как вычитал, что он дает большую точность...не помогло...билдер укурен до сих пор.
...
Рейтинг: 0 / 0
17.04.2013, 10:53
    #38228669
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
На правах лулза, проблема была таки во float классе, пропустил при переделывании на double 2 параметра, потому и не сработало.
Всем еще раз спасибо за помощь.
...
Рейтинг: 0 / 0
17.04.2013, 11:36
    #38228785
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Похоже товарищь даже не понял ничего в итоге.

У меня есть идея — сделать топик бессмысленных вопросов, где публиковать ссылки на вопросы, которые про своей сути настолько идиотские, что и отвечать на них бессмысленно.
...
Рейтинг: 0 / 0
17.04.2013, 11:46
    #38228817
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
MasterZivПохоже товарищь даже не понял ничего в итоге.

У меня есть идея — сделать топик бессмысленных вопросов, где апробировать ссылки на вопросы, которые про своей сути настолько идиотские, что и отвечать на них бессмысленно.поддерживаю ))
...
Рейтинг: 0 / 0
17.04.2013, 12:45
    #38228980
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
авторБыть может для вас вопрос идиотский, однако, вы не можете отрицать, что разные среды использующие разные компиляторы по разному работают с вещественными числами при одной и той же реализации кода и одном и том же языке.

МОГУ!

авторЕсли вы намекали, что классы float и double различны в точности и реализации,

0) это не классы. Это типы данных.
1) да, точность их действительно разная.


авторПС код проверял уже на gc++, MS VS 2005 express, QT...и там оно отрабатывало так как надо при использовании float.

Это очень похоже на описание впечатлений слепого, которого подвели к слону.
Оно конечно, определённая логика у него есть, но -- вся неверная, поскольку вся строится на ложных посылах, на ложных аксиомах.

авторПС 2 Обязательно сделайте такой топик, он покажет желание гуру поиздеваться над новичками, мб это спасет кого-то с более слабой психикой=)

Топик сделаем.

авторПС 3 мой предыдущий комментарий был не для вас о гуру которые не сталкиваются с прелестями Buildder 6.0, вы видимо используете другие среды или более продвинутые версии от эмберкадеро, но да будит вам известно не у всех есть возможность перейти в др среду в силу тех или иных обстоятельств.

Самое главное: Ты ПОНЯЛ, в чём у тебя была проблема, или нет?

авторбуду пытаться доказать преподу, что я не верблюд, а во всем виноват builder=(

Что кстати сказал препод ?

авторпробовал поменять в ключевых позициях float на double,так как вычитал, что он дает большую точность...не помогло...билдер укурен до сих пор.

Можешь показать, как пробовал?
...
Рейтинг: 0 / 0
17.04.2013, 23:33
    #38230117
ииих
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Насколько мне известно ВСЕ типы данных есть классы (со своими конструкторами, деструкторами и тп.).
Для кого то это видимо откровение, но я об этом читал у кого то из забугорных авторов, хотя автор там и писал class like
При ближайшем рассмотрении выяснилось, что в отладчике builder писал красивые дроби, однако, он по прежнему учитывал чудесный мусор и вместо 3 периодически писал 2, указателей там не было, все значения задавались через статические локальные переменные.

Преподаватель ничего не сказал, его устроило, что тестовые примеры считает и бумага написана...разочарован...
Проблему с недосчетом решил банальным добавлением единицы, но отлично понимаю, что это не правильно.

Слепой из анекдота/притчи насколько я помню полагался лишь на тактильные ощущения, почему делал неверные выводы, однако аналогия забавная, тк пытался написать не 1 лишь выражение и прыгать вокруг него, а пытался решить проблему через преобразования, хотя и весьма смутно представляю отличие double от float кроме как в количестве слов и размере.
По моему логично в случае проблемы с кодом, для проверки его проверить в др среде программирования (на компьютере с которым удается поработать стоит Win 7 Pro и builder, для тех кто в танке они оооочень странно периодически работают, включая fatal error'ы на ровном месте и прочие прелести).
Исходник в данный момент скинуть не могу ибо пишу с чужого компьютера :)

ПС сделайте тогда помимо топика и топик полезных советов новичкам, в который поместите не совсем стандартные решения, по типу примитивного увеличения динамического массива с помощью автоинкрементного оператора...
ПС2 как доберусь до компьютера с исходниками скину весь класс, чтобы меня больше не обвиняли в том, чего я не совершал, лишь на основании беглой проверки, в других средах программирования.
ПС3 Уважаемый модератор или кто вы есть, пишите пожалуйста от своего имени, а то обращаться к стенообразному анонимусу-допельгангеру не очень приятно=)
...
Рейтинг: 0 / 0
17.04.2013, 23:57
    #38230127
отбросить дробную часть
десятичные дроби и C++11ииихпропущено...

Быть может звезды сложились не так и дева в водолее...
Однако все именно так как я написал.
В функцию задаются вещественные значения, а при вычислении 0.1 волшебным образом превращается в 0.10000000024326, как следствие все дальнейшие расчеты идут лесом
Я чето тоже не нашел такого округления.
Странно, что её нету в стандартной библиотеке, хотя на x86 в FPU есть ассемблерная fstoi.
Можно написать самому простейшую функцию round:
http://ideone.com/rmLZZc
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include<iostream>
 
inline int round(float f) { return (f > 0)?(f+.5f):(f-.5f); }
 
int main() {
    int mas_size;mas_size=round((0.4-0.1)/0.1);
    std::cout << mas_size;    
    
    return 0;
}



Но если у вас десятичные дроби и C++11, то используйте десятичные дроби :)
http://www.cplusplus.com/reference/ratio/ratio/
Автор, ты вот это вот читал? Что-нибудь понял? Чем не решение?
...
Рейтинг: 0 / 0
18.04.2013, 00:48
    #38230148
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
ииихПС3 Уважаемый модератор или кто вы есть, пишите пожалуйста от своего имени, а то обращаться к стенообразному анонимусу-допельгангеру не очень приятно=)
Вы бы залогинились для начала, прежде чем предъявлять другим
...
Рейтинг: 0 / 0
18.04.2013, 08:24
    #38230238
отбросить дробную часть
Топикстартеру для начала сюда http://habrahabr.ru/post/112953/ и читать до просветления.
...
Рейтинг: 0 / 0
18.04.2013, 11:15
    #38230458
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
ииих,


ииих
Guest Насколько мне известно ВСЕ типы данных есть классы (со своими конструкторами, деструкторами и тп.).

Тебе известно неправильно. Либо ты читал какую-то хрень, либо понял неправильно.
...
Рейтинг: 0 / 0
18.04.2013, 11:28
    #38230490
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Мимо прходил,

Ничего статья, кстати.
...
Рейтинг: 0 / 0
19.04.2013, 00:57
    #38231882
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Мимо прходилТопикстартеру для начала сюда http://habrahabr.ru/post/112953/ и читать до просветления.

пытаюсь повторить

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#pragma pack(push,1)
union ParsedFloat
{
    ParsedFloat( float fvalue = 0.0f ) : value(fvalue) {}

    float   value;
    __int32 integer;

    // This is the IEEE 754 single-precision format
    struct ieee_t
    {
#ifdef  BIG_ENDIAN
        unsigned int sign : 1;
        unsigned int exponenta : 8;
        unsigned int mantissa : 23;
#endif
#ifdef  LITTLE_ENDIAN
        unsigned int mantissa : 23;
        unsigned int exponenta : 8;
        unsigned int sign : 1;
#endif
    }ieee;
};
#pragma pack(pop)



если число 0.15625 то все красиво

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    void testIEEE754()
    {
        ParsedFloat pfValue;

        pfValue.value = (float)0.15625;

        float exponenta = (float)::pow( 2.0, (long)( pfValue.ieee.exponenta - 127 ) );

        unsigned __int32 val = pfValue.ieee.mantissa | BIN32(00000000, 10000000, 00000000, 00000000) ;  // set 24-th bit

        for( int i = 23; 0 <= i; i--, val >>= 1 )  // // loop from the right until the first bit
        {
            if( 0x00000001 & val )
            {
                break;
            }
        }
        float mantissa  = ::pow( 2.0, -(double)val );

        float result = ( pfValue.ieee.sign ? -1 : 1 ) * exponenta + mantissa;

        CPPUNIT_ASSERT_EQUAL_FLOAT( "almost the same",  result, pfValue.value );
    }



Если 3.14 то в мантисе лежит 110010010000111111011011 или 13176795

то есть 2 в степени - 13176795 даcт 0.

в експоненте 2 в степени 1.

Сумма 2.0. Где что не так?
...
Рейтинг: 0 / 0
19.04.2013, 14:31
    #38232740
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Lepsik
пытаюсь повторить
Где что не так?

Битовые поля для этого не подходят.
...
Рейтинг: 0 / 0
19.04.2013, 14:44
    #38232769
отбросить дробную часть
MasterZivLepsikпытаюсь повторить
Где что не так?

Битовые поля для этого не подходят.
Это почему?
...
Рейтинг: 0 / 0
19.04.2013, 15:02
    #38232817
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
LepsikЕсли 3.14 то в мантисе лежит 110010010000111111011011 или 13176795

то есть 2 в степени - 13176795 даcт 0.


Из чего следует необходимость вычислять это: "2 в степени - 13176795"? Вы уверены что понимаете что делаете?

Учтен ли факт что мантисса хранится в нормализованном виде с подразумеваемой но не хранящейся 1 в старшем разряде?
...
Рейтинг: 0 / 0
19.04.2013, 16:55
    #38233123
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Это почему?MasterZivпропущено...


Битовые поля для этого не подходят.
Это почему?

Не знаю точно, пока до дома не доползу, где книжка.
Но по-моему битовые поля не гарантируют порядок следования битов в словах, в которых они хранятся.
Т.е. гарантируется только, что занимать они будут не более N бит (с возможным дополнением до полного слова)
и что они будут правильно паковаться в и выделяться из места, где они хранятся.
Но точно я стандарт на эту тему не помню, поэтому надо дойти до книги.

Но в общем, так это или не так, в любом случае выделять битики из слов в этом примере можно было бы и руками,
это бы работало всегда.
...
Рейтинг: 0 / 0
19.04.2013, 18:11
    #38233327
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отбросить дробную часть
Anatoly MoskovskyLepsikЕсли 3.14 то в мантисе лежит 110010010000111111011011 или 13176795

то есть 2 в степени - 13176795 даcт 0.


Из чего следует необходимость вычислять это: "2 в степени - 13176795"? Вы уверены что понимаете что делаете?


я всего лишь следую статье, где сказано что надо дополнить мантису битом слева ( 1 + 01 )

далее число 101b = 5 использовать как степень с отрицательным числом.

Вы вообше в статью заглядывали?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / отбросить дробную часть / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]