¿Cómo puedo hacer eso? He probado el abs (), pero sólo funciona para int del. Hay una construida en la manera de hacerlo?

CGFloat flo = -123;
abs(flo)

este devuelve 0

  • Estándar ‘abs’ función de las grandes obras De Swift 4
InformationsquelleAutor adit | 2013-01-16

4 Comentarios

  1. 70

    Uso fabs()

    CGFloat f = -123.4f;
    CGFloat g = fabs(f);

    CGFloat se define como un double en máquinas de 64 bits, y float en máquinas de 32 bits. Si usted está dirigida tanto a 64 y de 32 bits que esta respuesta se vuelve más complicado, pero aún es correcta.

    Desea utilizar fabs() porque trabaja en double tipos de datos que son más grandes que float. En 32-bits, asignar el valor de retorno de fabs() (que es un double) en un CGFloat (que es un float) es aceptar SÓLO si usted está tomando el valor absoluto de un CGFloat o float. Usted podría potencialmente desbordamiento de 32 bits CGFloat si intenta almacenar el valor absoluto de un gran double número. En resumen, 64-bit está muy bien, y en el de 32 bits no mezclar y combinar double y CGFloat y vas a estar bien.

    La ABS() macro aparentemente puede tener efectos secundarios en algunos compiladores.

    • Correcta (+1), pero se imprime el valor o realizar una asignación.
    • CGFloat es un typedef para flotar o doble (32/64 bits). fab toma el doble (al menos en mi xcode, que es lo que quiere). Así que sería seguro?
    • fabs() toma el doble, fabsf() toma un float y hay un largo doble de uno de los dos. No hay macros para determinar si CGFloat es un double o float.
    • Como CGFloat podría ser definido como un doble o un flotador, que es difícil decir que esta es la respuesta correcta: fabsf espera un float como parámetro de entrada, fab devuelve siempre un doble. El uso de std::abs() o la macro ABS() debe ser sugerido en un 32bit/64bit medio ambiente (como los móviles de hoy en día).
    • Esto ya no es lo correcto, como de 64 bits iOS, se obtiene una SEMÁNTICA de EMITIR ADVERTENCIA: Absolute value function 'fabsf' given an argument of type 'CGFloat' (aka 'double') but has parameter of type 'float' which may cause truncation of value
    • Se puede ampliar en su último comentario acerca de ABS() tener efectos secundarios en algunos compiladores? Que los compiladores? Si me quedo con Xcode, es completamente seguro?

  2. 9

    Para 64/32 bits del sistema

    #if CGFLOAT_IS_DOUBLE
        CGFloat g = fabs(flo);
    #else
        CGFloat g = fabsf(flo);
    #endif
    • Esta es la mejor respuesta corta, de hacer su propia macro contenedor. Aparte de esto determinar si usted realmente no tiene ninguna plataforma de 32 bits para preocuparse.
    • Esto es exactamente lo que la macro predefinida ABS es como Skela dicho en otra respuesta.
  3. 8

    Yo normalmente uso el ABS macro, como lo que yo puedo decir, que funciona independientemente del sistema que estás o que primitivos que está utilizando.

    CGFloat x = -1.1;
    double y = -2.1;
    NSInteger z = -5;
    
    x = ABS(x);
    y = ABS(y);
    z = ABS(z);
  4. 5

    Pequeña adición:

    CGFloat g = fabs(f);

    Esto resultará en un casting de advertencia, porque fabs() devuelve un valor double.
    Para obtener un valor de tipo float de nuevo, usted necesita usar fabsf().

    CGFloat g = fabsf(f);

Dejar respuesta

Please enter your comment!
Please enter your name here