Функция php sqrt, которая возвращает целое число?

Я создаю простую программу PHP, которая выполняет действие, если (и только если) три случайных числа вычисляются до целого числа. Все случайные числа — это целые числа, созданные с помощью функции rand(). Не вдаваясь в подробности вычисления, важно (с точки зрения моей задачи) то, что оно включает в себя извлечение квадратного корня. Не будучи очень опытным PHP-кодером, единственная функция квадратного корня, которую я знаю, это sqrt(). Проблема в том, что функция sqrt() возвращает число с плавающей запятой, даже если ввод является целым числом, а вывод точен. Я ненадолго подумал о преобразовании вывода в целое число (используя что-то вроде intval(), но это не сработает, потому что все выходные данные будут преобразованы в целые числа, что сделает тест бесполезным! Любые идеи о том, как сделать это? Спасибо,


person Bill    schedule 01.03.2011    source источник
comment
Просто проверьте, если floor($num)==$num? Или я что-то упускаю...   -  person Brad Christie    schedule 02.03.2011
comment
Ваша проблема несколько неясна.   -  person Nick Rolando    schedule 02.03.2011
comment
@Brad: В принципе, хорошая мысль, но == для поплавков почти всегда (читай: всегда) плохая идея. Сравните с помощью дельты. См., например. stackoverflow.com/questions/4682889/is-floating-point -все в порядке   -  person sleske    schedule 02.03.2011


Ответы (5)


Если вы просто хотите определить, является ли это идеальным квадратом, просто определите, является ли

intval(result) * intval(result) == originalValue

Я не знаю php-версию этих функций, но, возможно, вы знаете? :)

person corsiKa    schedule 01.03.2011
comment
+1 Хорошая идея. Обратите внимание, что это, скорее всего, не удастся, если original value является числом с плавающей запятой (неясно из вопроса), поскольку вы не можете надежно сравнивать числа с плавающей запятой с == (на любом языке). - person sleske; 02.03.2011
comment
Да, мне нравится этот. Это сработает, потому что исходное значение является целым числом. Спасибо! - person Bill; 02.03.2011

Это обычная проблема при работе с плавающей запятой. Просто убедитесь, что полученное число с плавающей запятой очень близко к целому числу; обычно это делается путем проверки того, что дробная часть очень мала:

if (abs(round(f)-f))<delta)
  # do stuff

Здесь delta — небольшая константа, например 0,0001. Насколько маленьким он должен быть, зависит от того, насколько вы ожидаете, что ваш результат будет близок к целому числу. Это будет зависеть от ваших расчетов.

person sleske    schedule 01.03.2011
comment
Это тоже хорошая идея (очень расчетливая!). Хороший трюк, чтобы знать. Я должен подумать о том, какая точность потребуется... - person Bill; 02.03.2011
comment
@Билл: Спасибо. На самом деле, это больше численный анализ, чем исчисление. И да, вычисление точности - сложная часть... это то, на что люди, занимающиеся численным анализом, иногда тратят годы... - person sleske; 02.03.2011

Что-то вроде if($result % 1.0 == 0) может сработать, но у меня нет возможности проверить это прямо сейчас.

person TheJubilex    schedule 01.03.2011
comment
Похоже, это должно работать, хотя я не уверен в проблемах с плавающей запятой, на которые указал Слеске. - person Bill; 02.03.2011
comment
-1 Это не работает. Оператор PHP % работает только с целыми числами. Таким образом, $result % 1.0 вернет 0 для любого ввода. Вам нужна функция fmod (модуль с плавающей запятой). Но даже в этом случае вам не следует сравнивать результат, используя ==, так как это почти никогда не безопасно делать для чисел fp. См., например. stackoverflow.com/questions/4682889/is-floating-point -все в порядке - person sleske; 03.03.2011

$result % 1e9 вернет целую часть $result (для отрицательных значений он найдет ячейку результата). Но это хак, поэтому вы можете использовать его только для развлечения.

https://repl.it/Chqm/1

person Andrey Bessonov    schedule 31.07.2016

Это знание из программирования на другом языке, но пытались ли вы умножить выражение на 1. например, если вам нужно было получить целое число чего-то вроде

a = 3.45 * 8;

сделай это

a = 3.45 * 8 * 1;
person Steven    schedule 31.07.2016