Hola chicos, para mi clase necesito hacer una raíz cuadrada de números, ¡pero no funciona! ¡HELLPP!
El reto:
Write a function or program that will "make a number square root".
Nota: Esto es código curricular. ¡Dé una respuesta "útil" para guiar a este nuevo programador en su camino hacia el éxito de la programación! ¡Ser creativo!
Respuestas:
Java
Wow, este es un problema complicado. Nunca he hecho una raíz cuadrada antes. He tomado raíces cuadradas, pero no he hecho una. No olvide hacer que su código se vea bonito para obtener crédito adicional en sus clases. Aquí está el código que hace una raíz cuadrada de un número ingresado:
Trolls:
System.out.print
s no imprimen ajava.lang.System.out.print
. Imprimen a una clase interna. Los dos primeros (que se supone que imprimen cadenas) no hacen nada; el segundo:100
) ?:0
. Falla por bucle infinito cuando la entrada es negativa por la misma razón que falla por bucle infinito cuando la entrada es negativa0
.fuente
JFrame.DO_NOTHING_ON_CLOSE
en la lista de trolls ...setAlwaysOnTop(true)
también.C ++
Bueno, si no tienes una ruta mejor, siempre existe la solución de fuerza bruta:
Esto itera a través de todos los valores posibles de a
double
(union
haciéndolo con unlong long
que es del mismo tamaño de bit, ya que no hay una buena manera de iterar a través de ellos usando dobles como dobles reales) hasta que encuentre uno cuyo cuadrado sean
.fuente
double
y Along long
es la cosa más aterradora que he visto.union
comportamiento indefinido es posible e iterar a través de los dobles es posible con la funciónstd::nextafter
std::nextafter
existía antes de que me lo mencionaras, así que sí, era querido.double
valores no se pueden producir al multiplicarx*x
dondex
estádouble
, también. Entonces, la búsqueda no tendrá éxito a veces (¿la mayoría de las veces?), Dando NaN en lugar de un resultado más correcto.Python 3
Este código simple dará una respuesta exacta :
fuente
En Python 3 puedes hacer lo siguiente:
fuente
Corrigiendo esta respuesta ,
Eso es simplemente incorrecto. Todos saben que el más rápido es ASM.
Puro x86_64 ASM!
¡A diferencia de otras respuestas retardadas, esta tiene una complejidad de O (1)!
Y también, a diferencia de otras respuestas, ¡esto es 101% preciso, porque
sqrt(0.5)
da0.70710678118655
!fuente
PCMPEQQ
ya no te parecen "basura mágica ilegible producida por un compilador"Pitón
Si está permitido en su clase, puede usar una biblioteca matemática compleja como ayuda aquí, instálela ejecutando el comando:
Entonces simplemente ejecutarías algo como este script de Python:
(Asegúrese de ejecutar eso con privilegios de administrador)
fuente
root
en Unixland).do
Obviamente esta es la mejor manera. Es tan rápido como te puedas imaginar mirando el código. Usando C, porque C es más rápido, y este problema requiere una solución rápida. He probado esto para mis números favoritos, como 7, 13 y 42, y parece funcionar.
fuente
results[number];
?do
Los trucos y la magia lo harán funcionar.
fuente
Python 3
Ustedes están haciendo todo mal. Cualquiera puede ver que la raíz cuadrada de 20 no es 4.47213595499958, ni siquiera √20. Esta solución mueve la difícil tarea de calcular la raíz cuadrada al módulo destinado para este propósito.
Uno de esos módulos es sympy, que proporciona matemáticas de raíces cuadradas. A diferencia de otras soluciones aquí, en realidad hace todo correctamente. Incluso supone que sqrt (-1) es I, ninguna de las soluciones aquí puede resolver eso.
Y aquí está el código modular, que es cómo se ven los buenos programas. Las funciones deben ser lo más pequeñas posible, si no lo son, eso significa que escribe programas horribles. Además, los programas deben tener muchos comentarios.
Y aquí hay un ejemplo de este programa funcionando.
fuente
print_format_prompt_with_thing_to_specify_get_default_prompt_format_to_getattr_get_sys_name_from_get_stdout_name_and_print_square_root_of_read_from_stdin_and_print_get_string_from_get_newline_to_getattr_get_sys_name_from_get_stdout_name
.JavaScript
Desafortunadamente, JavaScript no admite el símbolo de raíz cuadrada para los nombres de funciones. En cambio, podemos usar algún otro carácter del alfabeto Unicode para representar una función de raíz cuadrada.
En este ejemplo lo usaré
ᕂ
.Una vez que tenemos un símbolo válido para usar, podemos usar el objeto Math para generar una función de raíz cuadrada.
¡Es simple! :)
fuente
Julia
Obviamente, la mejor manera de hacerlo es usar la serie Taylor de raíz cuadrada:
Eso realmente genera valores muy precisos:
Pero, por supuesto, como es una aproximación (y también para ser una serie convergente) es inútil para valores no cercanos a 1:
fuente
a^2
(n veces) y multiplico pora
(n veces) la respuesta (sqrt(x)~a^n*sqroot(x/a^2n)
) x-> 0 (si a> 0) no es 1 (dando grandes errores). Además, si x / a ^ 2n ~ 1 los númerosa!=x
yn
cambiarán de forma arbitrariax
para obtener la presición deseada (lo que resulta molesto y lleva mucho tiempo encontrarlos).Látex
La solución para esto es bastante difícil y muy compleja, así que toma tu café. El problema es que, dependiendo del tipo de número que desee, la raíz cuadrada del código cambia significativamente. Te mostraré el problema. Digamos que ese
9
es tu número. Entonces el código se vería así:Ahora digamos que ese
1234321
es tu número, mira el código:Por último, pero no menos importante, digamos que su número es
0
.Una buena manera de resolver esto es escribir un programa en
Ook!
oPiet
, que quiere su número y lo generaLaTeX-sqrt-code
. Aquí hay un ejemplo muy simple paraOok!
, ya que solo puede leer un byte y no comprueba si este byte es un número legal o no, pero creo que llegará al punto.Lo mismo para
Piet
:Esta sería la forma más eficiente. También sugeriría usarlo,
Piet
ya que cada vez es una hermosa obra de arte, para que las cosas no se aburran rápidamente.fuente
Haskell
Dejé de confiar en las computadoras cuando escuché por primera vez sobre errores de punto flotante. Quiero decir, en serio, si incluso Google no puede controlarlos , ¿quién puede?
Entonces, nuestra mejor apuesta es encontrar una solución que involucre solo enteros. Afortunadamente, eso es fácil ya que solo podemos verificar todos los números, porque cada intervalo [1..n] contiene solo una cantidad finita de ellos, no como los reales de basura aleph-1. Aquí hay una implementación de muestra en Haskell:
Funciona como un encanto, échale un vistazo:
La precisión debería ser suficiente para la mayoría de las aplicaciones.
fuente
double
sy DDG está usandotriple
s.Java
La forma más precisa de hacer esto es iterar. Primero,
integer
pase por s hasta que pase por encima del objetivo, luego cambie adouble
s. Este método tiene la ventaja de ser exacto , a diferencia de otros métodos de "estimación" que puede ver. Sacrificas un poco de velocidad, pero para la mayoría de las aplicaciones, esto es exactamente lo que necesitas.Puede modificar esta respuesta según la precisión que necesite ser, pero esto debería funcionar al menos hasta la milmillonésima parte:
fuente
0.000000001
es que es propenso a errores de redondeo. He creado una solución más precisa en C ++.Math.nextUp(root)
lugar de+0.000000001
? Eso llevaría mucho más tiempo ... y se garantiza que tendrá éxito.Double
y me sorprendió cuando no pude encontrarlo. No pensé en mirarMath
, pero esto funciona bastante bien. No he tenido "falla" en nada todavía.Javascript
Estas constantes mágicas se pueden usar para calcular la raíz cuadrada de un número usando el alfabeto:
Pruebas:
Parece funcionar bastante bien. Me pregunto si hay un camino más corto.
fuente
JavaScript
¡Un problema muy difícil!
No hay una función incorporada para eso en JavaScript ...
Parece un trabajo para el solucionador Newton-Raphson.
Ahora puedes usar
Math.sqrt
fuente
JavaScript / ActionScript
No hay forma de calcular directamente una raíz cuadrada en ActionScript o JavaScript, sin embargo, hay una solución alternativa. Puedes obtener la raíz cuadrada de un número elevándolo a la
1/2
potencia.Así es como se vería en JavaScript y ActionScript 2:
Y aunque la función funciona igual de bien en ActionScript 3, recomendaría usar variables escritas y valores de retorno para mayor claridad y fiabilidad:
El troll:
fuente
1/2 == 0
.Python 2.7
Explicación
Citando
Wikipedia - Raíz cuadrada
En matemáticas, una raíz cuadrada de un número a es un número y tal que y 2 = a
En otras palabras, cada número es una raíz cuadrada de algún otro número.
Nota
Esta pregunta para mí es similar a un rompecabezas bien conocido Cómo hacer una línea más corta sin frotarla o cortarla
fuente
PHP (y otros):
Como la forma en que se describió la pregunta no significaba que realmente necesitáramos calcularla, aquí está mi solución:
Proporciona una manera de calcular con precisión la raíz cuadrada en varios idiomas.
La lista de idiomas se puede ampliar.
El valor puede enviarse por POST, GET, una cookie o incluso guardarse en la sesión.
Si solo proporciona el número, se confunde y da el resultado calculado, ¡eso es válido para (casi) CADA idioma!
fuente
do
Esto es mejor que las otras 27 respuestas porque todas son inexactas. Así es, solo dan una respuesta cuando debería haber 2. Esta ni siquiera intenta responder si va a estar mal, simplemente se rinde y se redondea.
Código de trolling:
for
abuso de bucle#define
utilizar paraaumentardisminuir la legibilidad√1024
devuelve3√1024 = ∓32
, lo cual es simplemente incorrecto)fuente
#define the number
... ¡bonito! Me gustó su razonamiento sobre la condición para mostrar el mensaje de uso, en particular.C ++
basado en http://en.wikipedia.org/wiki/Fast_inverse_square_root y la respuesta de @ snack.
Excepto en lugar de atornillar una forma de convertir x ^ (- 0.5) en x ^ (0.5) modifiqué el algoritmo para hacerlo directamente.
ALGORITMO
Convierta un número de coma flotante (en este caso, un doble) en un entero (en este caso, largo y largo).
Los primeros bits del número de coma flotante son el exponente: es decir, el número se almacena como 2 ^ AAA * 1.BBBBBBB. Entonces haga un cambio de derechos y este exponente se reduce a la mitad.
En la raíz cuadrada inversa original , este número se restaba de una constante para dar el recíproco. Solo lo agrego a la constante, porque quiero la raíz cuadrada directamente. El valor de la constante se elige para dar una respuesta que es la mejor aproximación al valor deseado.
Devuelve el número al punto flotante.
Opcionalmente, se pueden usar una o dos iteraciones del método de Newton para mejorar el resultado, pero no me molesté, porque quería ver qué tan cerca podría estar sin él.
Las constantes utilizadas parecen muy misteriosas, pero más allá de los primeros dígitos, los valores no son críticos. Encontré la constante por prueba y error. Me detuve tan pronto como obtuve un valor que a veces se subestima y a veces se sobreestima.
Resultados
La conversión solo es necesaria porque C no le permitirá realizar operaciones de desplazamiento de bits en un flotador, por lo que las únicas operaciones reales son el desplazamiento de bits y la suma. No he usado una sola iteración del método de Newton para mejorar el resultado, por lo que la precisión es notable. ¡El maestro del OP estará impresionado con la velocidad del método que (francamente) es lo suficientemente preciso para muchos propósitos!
fuente
10
* 1.000
, sqrt (4) = 2 ^01
* 1.000
= 2, sqrt (2) = 2 ^00
* 1.100
= 1.5. Entonces, el1
bit desplazado del exponente da una mantisa de 1.5, que no está muy lejos del valor verdadero de sqrt (2), que es aproximadamente 1.4. Pero no tengo idea de cómo da respuestas consistentemente con una precisión mejor del 3%.mi
Nota: esto solo funciona en mi computadora, ya que el hardware subyacente no almacena números en binario sino en base e, de modo que lo que aparece como
10
representa e,100
representa e e , etc. De esta manera, lo que podría llamar una máquina binaria a un desplazamiento de bits a la izquierda realiza x => e x , y lo que podría llamar a una máquina binaria a un desplazamiento de bits a la derecha realiza x => ln x. Claramente, es difícil representar sus números subyacentes en este medio de Internet muy limitado y centrado en binarios, pero hago lo mejor que puedo.La sintaxis de E es notablemente similar a la de C / C ++, por lo que debería ser fácil de entender para la mayoría de las personas.
fuente
n >> 1
no es lo mismo quelog(n)
.JavaScript / HTML / CSS
Pensé en usar jQuery y ids para troll un poco más, pero prefiero vanilla js.
El resultado no es perfectamente preciso, ¡pero funciona!
fuente
GeoGebra
Lea el valor de su respuesta desde el eje de coordenadas.
Pruébelo en línea aquí (requiere Java), o disfrute de algunas capturas de pantalla a continuación:
fuente
100% puro bash (entero)
Con presentación ascii-art:
Este cuadrado raíz perfecto debe obtenerse en bash utilizando el
source
comandoAntiguo (esta versión podría simplemente pegarse en cualquier terminal de consola)
Funcionará como:
Tenga en cuenta: ¡La raíz es cuadrada!
fuente
Java
Gracias a ggmx por el código para generar n dígitos de pi en java .
No tenía ganas de implementar la entrada. Para probar el cambio de código
sqrtThis
yexpectedPercision
.Así es como funciona el código. En primer lugar, obtener la raíz sqrt para integer es trivial, así que no tuve ganas de implementar eso y en su lugar utilicé javas integradas en sqrt fcn. Sin embargo, el resto del código es 100% legítimo.
La idea basica,
dado que pi es un número decimal infinito largo que no se repite, todas las secuencias numéricas deben ocurrir dentro de él(leer editar). Por lo tanto, su respuesta está dentro de pi !! Como tal, podemos aplicar una búsqueda de expresiones regulares en pi buscando su respuesta. Si no podemos encontrar una buena respuesta, ¡duplicaremos el tamaño de pi que estamos buscando!Es realmente fácil, de hecho se podría decir que es tan fácil como pi :)
No se ha demostrado que Edit Pi contenga todas las secuencias de números finitos dentro de él. El hecho de que pi es infinito y no repetitivo no es prueba suficiente de tal afirmación como lo demuestra Exelian. Sin embargo, muchos matemáticos creen que pi contiene todas las secuencias de números finitos.
fuente
JQuery
este es el más preciso (bonificación: ¡también funciona para letras!)
Aquí hay un violín
fuente
document.write
contrarreste lo suficiente.C ++
Esto eventualmente te dará una raíz cuadrada.
Corregí el código para reflejar mejor la pregunta. Gracias por sus sugerencias ... el código está actualizado.
fuente
x+=1e-16
?DBL_EPSILON
.Pitón
Esta solución:
Spoiler
Código:
fuente
C ++
Tu pregunta no se compila porque pones un! al final. C ++ no me gusta!
Aquí la pregunta correcta para el compilador:
Ah ... y el archivo make.
y 26317.def. Esto ya debería estar presente en su compilador
Sí, alguien puede usar -E para generar la respuesta correcta de preproceso, pero si sabe -E también sabe cómo cuadrar. : P Aquí algunos preprocesados. Muy poca solución mínima, sin verificación encuadernada, sin aviso. TIL que los trigrafos son preprocesados.
fuente