Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 15.06.2011, 16:27   #1
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Сообщение Проверка на четность

Я составил такую программу, проверяющую число на четность:
#include <iostream>

using namespace std;

int main() {
    int number;
    double half;

    cout << "Welcome to a program, with help of which"
    	<< "you will know, if your number is odd?" << endl;
    cout << "Please, input the number and press ENTER: ";
	cin >> number;
	half=number/2;
	cout << half << endl;
	if (half==static_cast<int>(half)) {
		cout << "Yes! Your number is even!";
	} else {
		cout << "No, your number isn't even.";
	}

    return 0;
}
Но почему-то half=5 при number=11, хотя переменная half относится к типу double. Когда я присваиваю тип double и к переменной number, то все нормализуется - half=5.5.

Знаю, что алгоритм не очень хороший, и что его решить можно при помощи рассмотрения остатка от деления числа на 2, но все же, почему некорректно работает этот код?
(Offline)
 
Ответить с цитированием
Старый 15.06.2011, 16:33   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Проверка на четность

half=number/2.0;
//хоть ты и упомянул про нелучшее решение, но: для проверки на чётность надо проверять младший бит
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
Hagrael (15.06.2011), HolyDel (16.06.2011)
Старый 15.06.2011, 16:55   #3
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Проверка на четность

Значит, при делении integer на integer не может получиться double? Но тогда как быть в такой ситуации:
У меня есть переменная int a и int b. Они содержат какие-то числа, мне не известные. Надо узнать точный результат деления. В этом случае с помощью оператора static_cast преобразовывать a или b?

для проверки на чётность надо проверять младший бит
Ух ты, интересный способ!
(Offline)
 
Ответить с цитированием
Старый 15.06.2011, 17:08   #4
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Проверка на четность

У меня есть переменная int a и int b. Они содержат какие-то числа, мне не известные. Надо узнать точный результат деления.
double R=a/double(b);
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hagrael (15.06.2011)
Старый 15.06.2011, 17:24   #5
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Проверка на четность

Спасибо, понял.
Правда пока не до конца понятно, почему разработчики языка сделали этот нюанс.
(Offline)
 
Ответить с цитированием
Старый 16.06.2011, 10:21   #6
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Проверка на четность

Сообщение от Hagrael Посмотреть сообщение
Правда пока не до конца понятно, почему разработчики языка сделали этот нюанс.
В Блитце аналогично.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.06.2011, 10:51   #7
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Проверка на четность

Сообщение от impersonalis Посмотреть сообщение
для проверки на чётность надо проверять младший бит
всегда считал что компилятор и сам справится с етой задачей, но отнюдь ((

; 13   : 	if(i%2)

	mov	edx, DWORD PTR _i$[esp+8]
	and	edx, -2147483647			; 80000001H
	jns	SHORT $LN5@wmain
	dec	edx
	or	edx, -2					; fffffffeH
	inc	edx
$LN5@wmain:
	je	SHORT $LN2@wmain

; 13   : 	if(i & 0x00000001)

	test	BYTE PTR _i$[esp+8], 1
	je	SHORT $LN2@wmain
как видим - результат с проверкой младшего бита намного короче.
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
ABTOMAT (20.06.2011), den (16.06.2011), Hagrael (16.06.2011), impersonalis (16.06.2011), maxturbo (16.06.2011), St_AnGer (20.06.2011), Tadeus (16.06.2011)
Старый 16.06.2011, 10:57   #8
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Проверка на четность

HolyDel, спасибо, но я до такого еще не дорос
(Offline)
 
Ответить с цитированием
Старый 20.06.2011, 17:20   #9
Reks888
Дэвелопер
 
Аватар для Reks888
 
Регистрация: 04.11.2009
Адрес: Украина, Днепропетровск
Сообщений: 1,480
Написано 662 полезных сообщений
(для 1,985 пользователей)
Ответ: Проверка на четность

Сообщение от HolyDel Посмотреть сообщение
; 13   : 	if(i%2)

	mov	edx, DWORD PTR _i$[esp+8]
	and	edx, -2147483647			; 80000001H
	jns	SHORT $LN5@wmain
	dec	edx
	or	edx, -2					; fffffffeH
	inc	edx
$LN5@wmain:
	je	SHORT $LN2@wmain

; 13   : 	if(i & 0x00000001)

	test	BYTE PTR _i$[esp+8], 1
	je	SHORT $LN2@wmain
Так вот какой ты, odd
__________________
>type C:\MyProj\*
www.sypiac.weebly.com
>
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (20.06.2011)
Старый 20.06.2011, 17:40   #10
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Проверка на четность

кстати, результат компиляции на чём (компилятор) был препарирован?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 20.06.2011, 23:49   #11
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Проверка на четность

cl.exe
(Offline)
 
Ответить с цитированием
Старый 21.06.2011, 00:46   #12
falcon
Разработчик
 
Аватар для falcon
 
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений
(для 470 пользователей)
Ответ: Проверка на четность

>>double R=a/double(b);
нииспользовать приведения в C-style!!

int b = 5;
main()
{
   int(b); //вроде бы просто приведение с игнорированием возвращаемого значения
   cout<<b<<endl;
}
неоднозначности ёпта
(ну ессно в арифметических выражениях нельзя доходить до маразма, но просто в памяти после приведённого примера, сломавшего мозг в своё время, всплывает отвращение к такому виду синтаксиса)
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 22:09.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com