Perdón por una pregunta tan general, pero cuál es el mejor método (lo más rápido posible y más seguro) para convertir int en float en ObjC:
Primero
int b = 10;
float a = [[NSNumber numberWithInt: b] floatValue]
Habrá NSNumber
instancia y mensajes numberWithInt
, floatValue
será enviado, ¿verdad?
Segundo
int b = 10;
float a = (float) b;
Estilo C: ¿esto con llamar a alguna subrutina?
¿O de alguna otra manera?
¿Y por qué?
Sherm Pendley
El tipo de letra de estilo C es el más claro y fácil de leer. Si por casualidad encontrara un código que creara un NSNumber
objeto solo para que haga la conversión, me dejaría preguntándome “¿Por qué lo hizo de esa manera? ¿Está sucediendo algo aquí que no sea una simple conversión de tipo antiguo? ¿Qué me estoy perdiendo?”
En cuanto a la velocidad, sospecho que la conversión de tipo simple también sería más rápida: el NSNumber
El objeto deberá realizar prácticamente las mismas operaciones para realizar la conversión, y tiene la sobrecarga adicional de creación de objetos y mensajería además de eso. Pero como en todos estos casos, no adivine: mida. Perfile su código para ver si la conversión es un cuello de botella lo suficientemente significativo como para merecer su atención.
-
Solo quiero llenar el
CGRect
struct alrededor de 10 veces y descubrí que no sé cómo convertir de la mejor manera– usuario663896
20 de abril de 2011 a las 10:58
-
La pregunta entonces es, ¿llenarlo con qué? Si los está llenando con valores codificados literales, simplemente puede escribir
NSMakeRect(1.0, 1.0, 1.0, 1.0)
, sin conversión necesaria. Por otro lado, si está leyendo datos de un plist, obtendrá un objeto NSNumber de todos modos, así que simplemente llame a su-floatValue
método. Escriba la conversión del valor de retorno de-intValue
no lograría nada más que una ofuscación sin sentido. La forma más sencilla es casi siempre la mejor.– Sherm Pendley
20 de abril de 2011 a las 11:04
-
lo estoy haciendo en
for
Ciclo de Obtengo valor int y paso esto aCGRect
estructura– usuario663896
20 de abril de 2011 a las 11:08
-
Entonces solo usa un tipo de conversión. Es el más claro y fácil de leer, y si solo lo haces diez veces, hay absolutamente no razón para perder el tiempo tratando de “optimizarlo”.
– Sherm Pendley
20 de abril de 2011 a las 11:15
R.. GitHub DEJAR DE AYUDAR A ICE
Ya que pregunta por la seguridad, lo primero que debe verificar es si el valor de su int
cabe en un float
. De lo contrario, está perdiendo datos en silencio. A menos que el valor sea bastante pequeño, no encajará. cambiaría a usar double
para que no tenga que preocuparse por esto, simplemente haga la asignación:
double d;
d = i;
Raramente hay algún uso para variables de tipo float
Muy parecido short
…
-
-1 El valor máximo para un flotante es mucho mayor que el valor máximo para un int. El máximo para un flotante se define como 3,40282347 x 10^38, mientras que el máximo para un int se define como 2147483647, lo que hace que el valor máximo para un flotante sea 1,58456316 × 10^29 veces mayor
– mella
25 de abril de 2012 a las 19:33
-
@nick: El hecho de que el valor máximo sea mayor no significa que
int
cabe en unfloat
. Afloat
(IEEE de precisión simple) solo tiene 24 bits de valor para la mantisa. Esto significa que si un número entero es mayor que 2^24-1, solo cabe en un flotante si los bits bajos son todos cero. Es decir,0x1fffffe
encaja pero0x1ffffff
no es. Si no me cree, intente convertir este último en flotante y viceversa y verá que el valor ha cambiado. (Si está en x86 con GCC, asegúrese de usar-ffloat-store
o es posible que en realidad no se convierta).– R.. GitHub DEJA DE AYUDAR A ICE
26 de abril de 2012 a las 3:20
-
Tienes razón, nunca supe eso y te pido disculpas, pero me pareció un poco extraño. Estoy tratando de quitar el -1, pero me dice que el voto está bloqueado 🙁
– mella
26 de abril de 2012 a las 16:04
Realmente no veo la necesidad de un NSNumber
objeto cuando está disponible un encasillado directo entre dos primitivas numéricas. Él NSNumber
La clase no estaba destinada únicamente a la conversión de tipos de todos modos.
Usa el yeso. No llama a una subrutina. El compilador se asegurará de que se use el código ensamblador correcto.
– alboroto
20 de abril de 2011 a las 11:16
No uses el yeso. Una llanura
float a = b;
es suficiente– pmg
20 de abril de 2011 a las 12:01