2010-05-22 2 views
1

Я хотел бы сделать что-л, как:Haskell - как я могу проверить, является ли номер Double/Float?

x `mod` 1.0 == 0 // => int 

но мне кажется, мод работает только для междунар ... помогите! EDIT: Я пытаюсь проверить, если данное число треугольник, http://en.wikipedia.org/wiki/Triangle_number так что моя идея состояла в том, чтобы проверить, если n1 Int ...

(п * (п + 1))/2 = s => n1 = (-1 + SQRT (1 + s))/2

+0

да? вы имеете в виду проверку того, что 'Float' не является круглым целым? – yairchu

+0

Выполнение такого рода вещей с помощью Floats - это плохая идея в целом, потому что ошибки округления могут так легко вас трогать. –

ответ

0

Всего редактирования:

Хорошо, я все еще не уверен, что вы пытаетесь достичь здесь.

  • Во-первых, что-либо по модулю 1 будет равным нулю, потому что функция модуляции имеет смысл только для целых чисел. Если вы хотите взять по модулю дробного типа, вы можете сначала преобразовать его в целое. Редактировать: Несмотря на то, что это стоит, Data.Fixed имеет функцию mod' для нецелых значений.
  • Я также не знаю, что вы подразумеваете под «проверьте, является ли n1 Int». Либо это, либо нет; вам не нужно проверять во время выполнения. Редактирование: Хорошо, теперь я вижу, что вы просто проверяете, имеет ли значение дробный компонент. Пол Джонсон правильно указывает выше, что разумно делать такие вещи с плавающей точкой.
  • Если вы хотите смешивать операции mod и sqrt в тех же вычислениях, вам придется вручную конвертировать между соответствующими типами. fromIntegral преобразует любой целочисленный тип в любой тип номера, floor, ceiling и round преобразует дробные типы в интегральные типы.
+0

Проверьте мое редактирование PLZ, я пытаюсь проверить, является ли заданный номер треугольником номер – MMM

+0

Thx для подсказки, теперь я сделал (потолок x == пол x) и, похоже, работает;) (false, если x имеет фракционную часть) – MMM

+0

@ МММ: Ладно, я все еще смущен, но рад, что смогу помочь ...? –

2

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

Используйте представление списка для создания треугольных чисел.

Поскольку они будут в порядке, вы узнаете, прошли ли вы мимо них.

Альтернативный подход, если вы работаете с большими числами, - это использовать бинарный поиск, чтобы сузить количество строк, которые могут привести к вашему кандидату.

+0

. Но этот список будет inifinty? Haskell перестает искать себя, когда nummber будет больше, чем поиск? – MMM

+0

Да, список будет бесконечным. И нет, Хаскелл не поймет этого, если вы не скажете об этом. Поэтому вам нужно выяснить, как завершить поиск. –

+0

С какой мерой это лучше? Это, конечно, дороже, чем просто использование формулы. Это также почти наверняка больше кода. – sepp2k

6

Для того, чтобы определить, является ли некоторый Float или Double неотличима от Haskell в Integer, использовать floor и ceiling вместе. Что-то вроде:

if floor n == ceiling n 
    then "It was some integer." 
    else "It's between integers." 

Там может быть также некоторые модные вещи вы можете сделать с представлением поплавка в двоичной, разоблачена класс типов RealFloat:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t%3ARealFloat

+0

Вы опоздали, я нашел, что решения есть, проверьте мой комментарий выше;) – MMM

+1

Где вы говорите «сами», я думаю, вы имеете в виду «я». – solidsnack

Смежные вопросы