En el código creado por Apple, existe esta línea:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
¿Hay alguna razón para expresar 1,000,000,000
como 1000*1000*1000
?
¿Por qué no 1000^3
para el caso?
objective-c
c
integer
literals
Pato
fuente
fuente
1_000_000_000
. Sin embargo, con constantes de tiempo esto es más difícil. Es más legible escribir30 * 60
(30 minutos en segundos) que escribir1800
. En realidad, hay idiomas que le permitirán escribir unidades, por ejemplometers
, permitiéndole protegerse contra las malas asignaciones.^
es un XOR, no un exponente u operador de potencia.Respuestas:
Una razón para declarar constantes de forma multiplicativa es mejorar la legibilidad, mientras que el rendimiento en tiempo de ejecución no se ve afectado. Además, para indicar que el escritor estaba pensando de manera multiplicativa sobre el número.
Considera esto:
Es claramente mejor que:
como este último no parece, a primera vista, la tercera potencia de 1024.
Como mencionó Amin Negm-Awad, el
^
operador es el binarioXOR
. Muchos idiomas carecen del operador de exponenciación de tiempo de compilación incorporado, de ahí la multiplicación.fuente
x
para obtener el tamaño del subrango ... y de repente tiene una fracción byte, que puede requerir lógica adicional para compensar.El resultado de
1000^3
es 1003.^
es el operador bit-XOR.Incluso si no trata con la Q en sí, agrego una aclaración.
x^y
no no siempre evaluar ax+y
como lo hace en el ejemplo de la pregunta. Tienes que xor cada bit. En el caso del ejemplo:Pero
fuente
^
operador significa XOR en C / C ++ / Objective-C, etc. En las calculadoras generalmente significa potencia x-to-the-y.Hay razones para no usar
1000 * 1000 * 1000
.Con 16 bits
int
,1000 * 1000
desbordamientos. Por lo tanto, el uso1000 * 1000 * 1000
reduce la portabilidad.Con 32 bits
int
, la siguiente primera línea de código se desborda.Sugiera que el valor inicial coincida con el tipo de destino para facilitar la lectura, la portabilidad y la corrección.
También podría usar
e
notación simple para valores que son exactamente representables como adouble
. Por supuesto, esto lleva a saber sidouble
puede representar exactamente el valor del número entero, algo preocupante con valores superiores a 1e9. (VerDBL_EPSILON
yDBL_DIG
).fuente
double
puede representar exactamente todos los enteros hasta 2 ^ 53 ≈ 9e15.double
uso de binary64, a pesar de que se usa con mucha frecuencia. Según la especificación C, los valores de hasta 1e9 más o menos son exactamente representables. Depende si desea codificar para especificar o confiar en la práctica común.1000
y1000000000000
son constantes enteras . Cada uno independientemente tiene el tipo seleccionado deint
,long
olong long
. El compilador usa el primer tipo de esos 3 en los que se ajusta la constante entera .1000 * 1000 * 1000 * 1000
se hace con lasint
matemáticas como cada1000
una en unint
. El producto se desborda con 32 bitsint
.1000000000000
es ciertamente representable como unlong long
(o posiblemente más estrecho), sin desbordamiento. El tipo de objetivolong long Duration
no afecta a este "lado derecho de la =" detección.int
,long x = 1000 * 1000 * 1000L;
se desbordaría, mientraslong x = 1000L * 1000 * 1000;
que no.Por legibilidad.
Colocar comas y espacios entre los ceros (
1 000 000 000
o1,000,000,000
) produciría un error de sintaxis, y tener1000000000
en el código hace que sea difícil ver exactamente cuántos ceros hay.1000*1000*1000
hace evidente que son 10 ^ 9, porque nuestros ojos pueden procesar los trozos más fácilmente. Además, no hay costo de tiempo de ejecución, porque el compilador lo reemplazará con la constante1000000000
.fuente
1,000,000,000
no produciría un error de sintaxis, solo significaría algo más. Por ejemploCMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
1_000_000_000
_
separando :)'
separador, en C ++ 14, para que pueda usarlo1'000'000'000
. (Se eligió porque1,000,000,000
podría malinterpretarse como el operador de coma o 4 parámetros distintos, y_1_000_000_000
es un nombre de variable válido (pero probablemente malo)).Por legibilidad. A modo de comparación, Java admite
_
números para mejorar la legibilidad (propuesta por primera vez por Stephen Colebourne como respuesta a la PROPUESTA de Derek Foster: Literales binarios para Project Coin / JSR 334). Uno escribiría1_000_000_000
aquí.En un orden aproximadamente cronológico, desde el soporte más antiguo hasta el más nuevo:
"(1)1111 1111"
( aparentemente no para valores decimales, solo para cadenas de bits que representan valores binarios, cuartos, octales o hexadecimales )1$000$000
1_000_000_000
1'000'000'000
Es una característica relativamente nueva para los idiomas darse cuenta de que deberían ser compatibles (y luego está Perl). Como en la excelente respuesta de chux @,
1000*1000...
es una solución parcial pero abre el programador a errores que desbordan la multiplicación incluso si el resultado final es de tipo grande.fuente
Puede ser más simple de leer y obtener algunas asociaciones con el
1,000,000,000
formulario.Desde el punto de vista técnico, supongo que no hay diferencia entre el número directo o la multiplicación. El compilador lo generará como un número constante de mil millones de todos modos.
Si habla sobre el objetivo-c, entonces
1000^3
no funcionará porque no existe tal sintaxis para pow (es xor). En cambio,pow()
se puede usar la función. Pero en ese caso, no será óptimo, será una llamada de función de tiempo de ejecución y no una constante generada por el compilador.fuente
Para ilustrar las razones, considere el siguiente programa de prueba:
fuente
Otra forma de lograr un efecto similar en C para los números decimales es usar la notación literal de coma flotante, siempre que un doble pueda representar el número que desee sin pérdida de precisión.
IEEE 754 doble de 64 bits puede representar cualquier número entero no negativo <= 2 ^ 53 sin problema. Por lo general, el doble largo (80 o 128 bits) puede ir aún más lejos que eso. Las conversiones se realizarán en tiempo de compilación, por lo que no hay sobrecarga de tiempo de ejecución y es probable que reciba advertencias si hay una pérdida inesperada de precisión y tiene un buen compilador.
fuente