Haskell - как я могу проверить, является ли число Double / Float? - PullRequest
1 голос
/ 23 мая 2010

Я хотел бы сделать что-то вроде:

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

но похоже мод работает только для int ... help! РЕДАКТИРОВАТЬ: Я пытаюсь проверить, является ли данное число треугольником, http://en.wikipedia.org/wiki/Triangle_number, поэтому моя идея состояла в том, чтобы проверить, является ли n1 Int ...

(n * (n + 1)) / 2 = s => n1 = (-1 + sqrt (1 +) 8s)) / 2

Ответы [ 3 ]

7 голосов
/ 24 мая 2010

Чтобы определить, неотличимы ли определенные Float или Double от Integer в Haskell, используйте вместе 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

2 голосов
/ 23 мая 2010

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

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

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

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

0 голосов
/ 23 мая 2010

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

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

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