No código criado pela Apple, existe esta linha:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Existe algum motivo para expressar 1,000,000,000
como 1000*1000*1000
?
Por que não 1000^3
?
objective-c
c
integer
literals
Pato
fonte
fonte
1_000_000_000
. No entanto, com constantes de tempo, isso é mais difícil. É mais legível escrever30 * 60
(30 minutos em segundos) do que escrever1800
. Na verdade, existem idiomas que permitem que você escreva unidades, por exemplometers
, permitindo que você se proteja contra atribuições ruins.^
é um XOR, não um expoente ou operador de energia.Respostas:
Um motivo para declarar constantes de maneira multiplicativa é melhorar a legibilidade, enquanto o desempenho em tempo de execução não é afetado. Além disso, para indicar que o escritor estava pensando de maneira multiplicativa sobre o número.
Considere isto:
É claramente melhor que:
como este último não parece, à primeira vista, o terceiro poder de 1024.
Como Amin Negm-Awad mencionou, o
^
operador é o binárioXOR
. Muitos idiomas não possuem o operador interno de exponenciação em tempo de compilação, daí a multiplicação.fonte
x
para obter o tamanho do subintervalo ... e de repente você tem um fracionário byte, o que pode exigir lógica adicional para compensar.O resultado de
1000^3
é 1003.^
é o operador bit-XOR.Mesmo que não lide com o próprio Q, acrescento um esclarecimento.
x^y
se não sempre avaliar ax+y
como faz no exemplo do questionador. Você tem que xor todo. No caso do exemplo:Mas
fonte
^
operador significa XOR em C / C ++ / Objective-C etc. Nas calculadoras, geralmente significa potência x-to-y.Existem razões para não usar
1000 * 1000 * 1000
.Com 16 bits
int
,1000 * 1000
estouros excessivos. Portanto, o uso1000 * 1000 * 1000
reduz a portabilidade.Com 32 bits
int
, a primeira linha de código a seguir é excedida.Sugira que o valor do lead corresponda ao tipo de destino para legibilidade, portabilidade e correção.
Também poderia usar a
e
notação simples para valores que são exatamente representáveis como adouble
. É claro que isso leva a saber sedouble
pode representar exatamente o valor do número inteiro - algo preocupante com valores maiores que 1e9. (VejaDBL_EPSILON
eDBL_DIG
).fonte
double
pode representar exatamente todos os números inteiros até 2 ^ 53 ≈ 9e15.double
uso de binary64, mesmo que seja muito usado. De acordo com a especificação C, valores de até 1e9 ou mais são exatamente representáveis. Depende se você deseja codificar para especificar ou confiar na prática comum.1000
e1000000000000
são constantes inteiras . Cada um independentemente com o tipo selecionado deint
,long
oulong long
. O compilador usa o primeiro tipo daqueles 3 nos quais a constante inteira se encaixa.1000 * 1000 * 1000 * 1000
é feito comint
matemática como cada1000
um emint
. O produto está cheio de 32 bitsint
.1000000000000
é certamente representável como umlong long
(ou possivelmente mais estreito) - sem transbordamento. O tipo do alvolong long Duration
não afeta esse "lado direito da desatreminação =".int
,long x = 1000 * 1000 * 1000L;
iria transbordar, enquantolong x = 1000L * 1000 * 1000;
não.Para legibilidade.
Colocar vírgulas e espaços entre os zeros (
1 000 000 000
ou1,000,000,000
) produziria um erro de sintaxe, e ter1000000000
no código dificulta a visualização exata de quantos zeros existem.1000*1000*1000
torna aparente que é 10 ^ 9, porque nossos olhos podem processar os pedaços mais facilmente. Além disso, não há custo de tempo de execução, porque o compilador o substituirá pela constante1000000000
.fonte
1,000,000,000
não produziria um erro de sintaxe, apenas significaria outra coisa. Por exemploCMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
1_000_000_000
_
como separador, também :)'
separador, no C ++ 14, para que você possa usá-lo1'000'000'000
. (Ele foi escolhido porque1,000,000,000
podia ser mal interpretado como o operador vírgula ou 4 parâmetros distintos, e_1_000_000_000
é um nome de variável válido (mas provavelmente ruim).)Para legibilidade. Para comparação, o Java suporta
_
números para melhorar a legibilidade (proposto pela primeira vez por Stephen Colebourne como resposta à PROPOSTA de Derek Foster: Literais binários para o Project Coin / JSR 334). Alguém escreveria1_000_000_000
aqui.Em ordem cronológica, do suporte mais antigo ao mais recente:
"(1)1111 1111"
( aparentemente não para valores decimais, apenas para cadeias de bits que representam valores binários, quartais, octais ou hexadecimais )1$000$000
1_000_000_000
1'000'000'000
É um recurso relativamente novo para os idiomas perceberem que eles devem suportar (e então há o Perl). Como na excelente resposta do chux @,
1000*1000...
é uma solução parcial, mas abre o programador para que os erros ultrapassem a multiplicação, mesmo que o resultado final seja do tipo grande.fonte
Pode ser mais simples de ler e obter algumas associações com o
1,000,000,000
formulário.Do ponto de vista técnico, acho que não há diferença entre o número direto ou a multiplicação. O compilador irá gerá-lo como um número constante de bilhões de qualquer maneira.
Se você falar sobre o objetivo-c,
1000^3
não funcionará porque não existe essa sintaxe para o pow (é xor). Em vez disso, apow()
função pode ser usada. Mas, nesse caso, não será o ideal, será uma chamada de função de tempo de execução, não uma constante gerada pelo compilador.fonte
Para ilustrar os motivos, considere o seguinte programa de teste:
fonte
Outra maneira de obter um efeito semelhante em C para números decimais é usar a notação literal de ponto flutuante - desde que um duplo possa representar o número desejado sem perda de precisão.
O IEEE 754 de 64 bits duplo pode representar qualquer número inteiro não negativo <= 2 ^ 53 sem problemas. Normalmente, o duplo longo (80 ou 128 bits) pode ir ainda mais longe. As conversões serão feitas em tempo de compilação, portanto, não haverá sobrecarga de tempo de execução e você provavelmente receberá avisos se houver uma perda inesperada de precisão e você tiver um bom compilador.
fonte