По модулю, число с плавающей запятой - PullRequest
0 голосов
/ 28 декабря 2010

Как использовать по модулю для чисел с плавающей запятой?Например, как найти результат

select power(cast(101 as float),50)%221

Ответы [ 3 ]

2 голосов
/ 13 декабря 2012

В некоторых ситуациях может потребоваться использовать модуль по большим числам, и один из способов сделать это - использовать десятичную (поскольку int и bigint могут быть слишком маленькими). ​​

Вы должны самостоятельно реализовать оператор по модулю- один из способов это:

SELECT (x/y-ROUND(x/y,0,1))*y

ROUND(x/y,0,1) функция возвращает усеченное x/y.Например,

(10.0/3 - ROUND(10.0/3,0,1))*3 = (3.333333-3)*3 = 1 

Это удобно при решении операций по модулю для огромных целых чисел, таких как 24840081102364802172700 mod 97:

SELECT (CAST(24840081102364802172700 AS DECIMAL(23,0))/97 - ROUND(CAST(24840081102364802172700 AS DECIMAL(23,0))/97 ,0,1)) *97 = 10.0

Вы также можете округлить его в конце.

1 голос
/ 28 декабря 2010

Вы должны были бы привести к десятичному числу для меньших чисел

 select cast(power(cast(101 as float),50) as decimal(38,0)) % 221

или

 select power(cast(101 as decimal(38,0)),50) % 221

Это не удается, хотя с таким большим числом

Но тогда этов любом случае не имеет смысла для больших чисел.

  • float с точностью до 15 значащих цифр.
  • 101 ^ 50 = 1.64463182184388E + 100
  • предел погрешности (аппроксимация с плавающей запятой) примерно на 82 порядка (1E + 82) выше, чем ваш модуль 221

Любой ответ по модулю - полный мусор

Редактировать:

Десятичное число приближается к 10 ^ 38

Возьмите число с плавающей точкой в ​​10 ^ 39 или 1E + 39, тогда вы с точностью до 1E24 (15 значащих цифр).

Ваш модуль равен 221= 2,2E + 2

Вы допускаете ошибку, т.е. 1E + 24 / 2,2E + 2 = 4,4E + 21

Просто чтобы быть на 100% ясным, ваша точность в 4 400 000 000 000 000 000 000 000 раз больше вашейпо модулю.

Это даже не приблизительно: это мусор

0 голосов
/ 28 декабря 2010

Если SQL Server поддерживает это, функция мода должна обрабатывать числа с плавающей точкой.Но вычисление, которое вы показываете, с плавающей точкой не обеспечит адекватной точности.Что происходит, когда вы выходите из состава?

...