Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Python  (Прочитано 2257 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн slaviart

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Python
« : 15 Январь 2009, 01:20:45 »
Задание:
Составить программу расчета гипотенузы прямоугольного треугольника. Длинна катетов запрашивается у пользователя.

Решил попробывать ее решить 3-мя способами и вот получил сильное удевление когда один из них не зарбаотал.

Код программы:

Ver 1 :

__author__="slaviart"
__date__ ="$14.01.2009 23:11:49$"
a = raw_input("Введите значение первого катета:")
b = raw_input("Введите значение второго катета:")
z = (float(a) + float(b))**float(0.5)
print "Гипотенуза треугольника равна : ",z

Результаты программы ver 1 :

Введите значение первого катета:5
Введите значение второго катета:7
Гипотенуза треугольника равна :  3.46410161514

Ver 2:

__author__="slaviart"
__date__ ="$14.01.2009 23:11:49$"
from math import sqrt
a = raw_input("Введите значение первого катета:")
b = raw_input("Введите значение второго катета:")
z = sqrt(float(a) + float(b))
print "Гипотенуза треугольника равна : ",z

Результаты программы ver 2 :

Введите значение первого катета:5
Введите значение второго катета:7
Гипотенуза треугольника равна :  3.46410161514

Ver 3
__author__="slaviart"
__date__ ="$14.01.2009 23:11:49$"
a = raw_input("Введите значение первого катета:")
b = raw_input("Введите значение второго катета:")
z = (float(a) + float(b))**(1/2)
print "Гипотенуза треугольника равна : ",z

Результат программы ver 3 :

Введите значение первого катета:5
Введите значение второго катета:7
Гипотенуза треугольника равна :  1.0

----

Вопрос почему ver 3 дает такой результат

Оффлайн Otetz

  • Активист
  • *
  • Сообщений: 455
    • Просмотр профиля
Re: Python
« Ответ #1 : 15 Январь 2009, 01:51:34 »
Патамушта

1/2 = 0

а вот 1,0/2,0 = 0,5

алсо http://docs.python.org/tutorial/floatingpoint.html
« Последнее редактирование: 15 Январь 2009, 01:53:09 от Otetz »
Anything, that MAY go wrong, WILL go wrong...

Оффлайн slaviart

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Python
« Ответ #2 : 15 Январь 2009, 01:57:36 »
тоесть в данном случае float(1/2) не спасает

и как может быть что 1 /2 получится 0 ...

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Python
« Ответ #3 : 15 Январь 2009, 02:00:02 »
не, главный вопрос тут такой: почему тремя способами гипотенуза оказалась меньше катетов?   :idiot2:
(Нажмите, чтобы показать/скрыть)

Оффлайн slaviart

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Python
« Ответ #4 : 15 Январь 2009, 02:20:25 »
Спасибо я знаю теорему пифагора, но главой задачей на форуме было узнать почему не работало возведение в степень (1\2) я повыбрасывал не нужное из формулы, оставил основное то что вызывало не понятие.
« Последнее редактирование: 15 Январь 2009, 02:25:41 от slaviart »

Оффлайн Otetz

  • Активист
  • *
  • Сообщений: 455
    • Просмотр профиля
Re: Python
« Ответ #5 : 15 Январь 2009, 02:24:04 »
не, главный вопрос тут такой: почему тремя способами гипотенуза оказалась меньше катетов?   :idiot2:
(Нажмите, чтобы показать/скрыть)

Гггг. Прикольный тред. :)

Я даже не заметил, что ман по теореме Пифагора автором не вкурился. Ну в третьем варианте у парня однозначно будет 1. Всегда. Ибо любое число в степени 0.... :) А так да, математика негодная во всех вариантах.

Ежели не указан float (или, в данном случае можно и просто 1.0/2.0 ибо константа), то округляИтся в меньшую сторону. Потому и zero :)

Upd.

Будучи студентом, на лекции по метрологии нам растолковывали про значащие цифры. В своё время я тоже был шокирован, когда узнал, что 4*4 = 20 а 4,0*4,0 = 16 xD
И когда мы выполняли задание по физической химии... Решаешь, решаешь.... длииииииные уравнения. Готов результат. Даёш ь преподу, он: "неправильно!". Цикл повторялся n раз до тех пор, пока препод не сжаливался и не говорил, что ответ не 2.012 а 2.0120 )
« Последнее редактирование: 15 Январь 2009, 02:29:22 от Otetz »
Anything, that MAY go wrong, WILL go wrong...

Оффлайн Nxx

  • Старожил
  • *
  • Сообщений: 1635
    • Просмотр профиля
Re: Python
« Ответ #6 : 15 Январь 2009, 03:49:52 »
Цитировать
Цикл повторялся n раз до тех пор, пока препод не сжаливался и не говорил, что ответ не 2.012 а 2.0120
Обычно точность решения должна соответствовать точности исходных данных.
OpenSUSE 11.3 x86-64

Оффлайн slaviart

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Python
« Ответ #7 : 15 Январь 2009, 04:28:53 »
обычно точность задают сразу в условие задачи

Оффлайн Systo

  • Новичок
  • *
  • Сообщений: 25
    • Просмотр профиля
Re: Python
« Ответ #8 : 15 Январь 2009, 12:51:58 »
А давайте посмотрим на конструкцию float(1/2) внимательнее. Что мы видим? Сначала выполняется целочисленное деление. Именно целочисленное, поскольку оба числа целые. И лишь потом результат преобразуется в вещественное. А результат то ноль.. Вот и ответ на Ваш вопрос. Если немного вглубь пойти, то целочисленное деление на степени двойки часто реализуется сдвигами вправо. Сдвиньте 1 на 1 разряд вправо, что соответствует делению на 2. Что получите? Про приоритеты операций еще немного почитайте. Тогда совсем станет понятно, почему так.
FreeBSD (2.2.6 - 8.0), Kubuntu (7.04 - 9.10), Ubuntu (8.04 - 9.04), OpenSUSE (11.1-11.2)

Оффлайн slaviart

  • Автор темы
  • Участник
  • *
  • Сообщений: 101
    • Просмотр профиля
Re: Python
« Ответ #9 : 15 Январь 2009, 14:55:52 »
float(1)/float(2)

Оффлайн _Raven_

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Python
« Ответ #10 : 20 Январь 2009, 17:22:26 »
Python 2.5.1 (r251:54863, Jul 31 2008, 23:17:40)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1./2
0.5
>>> 1./2.
0.5
>>> 1/2.
0.5
>>>
Достаточно что бы один из аргументов был вещественный

 

Страница сгенерирована за 0.057 секунд. Запросов: 24.