|
15.06.2011, 16:27
|
#1
|
Нуждающийся
Регистрация: 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
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка на четность
half=number/2.0;
//хоть ты и упомянул про нелучшее решение, но: для проверки на чётность надо проверять младший бит
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
15.06.2011, 16:55
|
#3
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Проверка на четность
Значит, при делении integer на integer не может получиться double? Но тогда как быть в такой ситуации:
У меня есть переменная int a и int b. Они содержат какие-то числа, мне не известные. Надо узнать точный результат деления. В этом случае с помощью оператора static_cast преобразовывать a или b?
для проверки на чётность надо проверять младший бит
|
Ух ты, интересный способ!
|
(Offline)
|
|
15.06.2011, 17:08
|
#4
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка на четность
У меня есть переменная int a и int b. Они содержат какие-то числа, мне не известные. Надо узнать точный результат деления.
|
double R=a/double(b);
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.06.2011, 17:24
|
#5
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Проверка на четность
Спасибо, понял.
Правда пока не до конца понятно, почему разработчики языка сделали этот нюанс.
|
(Offline)
|
|
16.06.2011, 10:21
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка на четность
Сообщение от Hagrael
Правда пока не до конца понятно, почему разработчики языка сделали этот нюанс.
|
В Блитце аналогично.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
16.06.2011, 10:51
|
#7
|
☭
Регистрация: 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 за это полезное сообщение:
|
|
16.06.2011, 10:57
|
#8
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Проверка на четность
HolyDel, спасибо, но я до такого еще не дорос
|
(Offline)
|
|
20.06.2011, 17:20
|
#9
|
Дэвелопер
Регистрация: 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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.06.2011, 17:40
|
#10
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка на четность
кстати, результат компиляции на чём (компилятор) был препарирован?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
20.06.2011, 23:49
|
#11
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Проверка на четность
cl.exe
|
(Offline)
|
|
21.06.2011, 00:46
|
#12
|
Разработчик
Регистрация: 12.07.2008
Сообщений: 523
Написано 196 полезных сообщений (для 470 пользователей)
|
Ответ: Проверка на четность
>>double R=a/double(b);
нииспользовать приведения в C-style!!
int b = 5;
main()
{
int(b); //вроде бы просто приведение с игнорированием возвращаемого значения
cout<<b<<endl;
}
неоднозначности ёпта
(ну ессно в арифметических выражениях нельзя доходить до маразма, но просто в памяти после приведённого примера, сломавшего мозг в своё время, всплывает отвращение к такому виду синтаксиса)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:45.
|