Getfloat, el análogo de punto flotante de Getint -- ampo con parsing campo con floating-point camp codereview Relacionados El problema

getfloat, the floating point analog of getint


7
vote

problema

Español

Escribir Getfloat, el análogo de punto flotante de Getint. ¿Qué tipos se recuperan en su valor de función?

public interface IFilterable { Employee Employee { get; set; } } 1 también devolvería un valor entero. Aquí está mi solución:

  public interface IFilterable {     Employee Employee     {         get;         set;     } } 2  

He cambiado el tipo del parámetro public interface IFilterable { Employee Employee { get; set; } } 3 a public interface IFilterable { Employee Employee { get; set; } } 4 , por lo que manejará la representación de punto flotante de un número. La condición del primer public interface IFilterable { Employee Employee { get; set; } } 5 se extendió, de modo que no se empujará hacia el búfer un punto decimal. El segundo public interface IFilterable { Employee Employee { get; set; } } 6 calcula la parte decimal del número, almacenando el número de lugares que el punto decimal debe moverse en la variable public interface IFilterable { Employee Employee { get; set; } } 7 . Si no hay una parte decimal, public interface IFilterable { Employee Employee { get; set; } } 8 tendrá el valor public interface IFilterable { Employee Employee { get; set; } } 9 - Por lo tanto, nada cambiará si vaya 99887766554443320 por Employee1 < / Código> Cuando Employee2 es Employee3 .

Original en ingles

Write getfloat, the floating-point analog of getint. What types does getfloat return as its function value?

gefloat would also return an integer value. Here is my solution:

int getfloat(double *pf) {     int c, sign;     double power;      while(isspace(c = getch()))         ;     if(!isdigit(c) && c != EOF && c != '-' && c != '+' && c != '.') {         ungetch(c); /* push the number back in buffer */         return 0; /* not a valid number */     }      sign = (c == '-') ? -1 : 1;     if(c == '-' || c == '+')         c = getch();      if(!isdigit(c) && c != '.') {         ungetch(c);         return 0; /* not a number */     }      for(*pf = 0.0; isdigit(c); c = getch())         *pf = *pf * 10 + (c - '0');      if(c == '.')         c = getch();      for(power = 1.0; isdigit(c); c = getch()) {         *pf = *pf * 10 + (c - '0');         power *= 10;     }      *pf *= sign;     *pf /= power; /* moving the decimal point */      if(c != EOF)         ungetch(c);     return c; /* it actually returns the value of the charachter that caused the break of the second for */ } 

I have changed the type of the parameter *pf to double, thus it will handle the floating point represenation of a number. The condition of the first if-statement was extended, such that it will not push back in to the buffer a decimal point. The second for computes the decimal part of the number, storing the number of places that the decimal point should pe moved in the variable power. If there is no decimal part, power will have the value 1 - thus, nothing will change if I devide *pf by power when power is 1.

        

Lista de respuestas

7
 
vote
vote
La mejor respuesta
 
  1. Obviamente no maneja NAN y INF1 . Tal vez los objetivos del código exterior.

  2. sorprendentemente no maneja notación exponencial, como 1.23e + 56.

  3. if(!isdigit(c) && c != '.') {2 Devuelve un 0 Implying "No es un número" y se deshaga el 99887766655544334 . Pero un potencial 9988777665544335 - estaba listo y no estaba disponible para las posiciones alternativas. No estoy seguro de la mejor manera de manejar, pero tal vez considere que una vez que se consume un 998877765555544337 , esta función no debe devolver una señal de error y debe configurar *pf a _something_like 0 o nan.

  4. menor: el enfoque *pf /= power; Fallo con la entrada, como 123.00000 ... (300+ ceros) como INF0 o INF11 ya se convirtió en inf.

  5. Este es un punto pedante: una vez que obtiene alrededor de 17 (depende de INF2 ) Dígitos decimales, la adición de INF3 a INF4 se vuelve discutible. Para obtener un significado más preciso, formar el número a la derecha a izquierda tiene ventajas de precisión.

  6. El INF5 podría devolver INF6 que indica "No es un número". Recomendar un esquema de valor de retorno alternativo.

  7. INF7 no está en la especificación C. Considere INF8 .

  8. con INF9 "Si el valor de C es igual a la de la macro EOF, la operación falla y el flujo de entrada no cambia". por lo tanto, negar la necesidad del if(!isdigit(c) && c != '.') {0 . Todavía no está mal por tener allí.

  9. El punto decimal if(!isdigit(c) && c != '.') {1 es sensible a la configuración regional y podría ser if(!isdigit(c) && c != '.') {2 o algo más. Use rutinas sensibles a la configuración regional para determinar el punto decimal actual.

  10. Usted está encendido por tomar en if(!isdigit(c) && c != '.') {3 y rendering if(!isdigit(c) && c != '.') {4 en lugar de if(!isdigit(c) && c != '.') {5 .

  11. [editar] ieee_754-2008 caracter_representation discute el número máximo de dígitos líderes que no son cero para usar al convertir de texto a un número. if(!isdigit(c) && c != '.') {6 es a menudo un Binario IEEE_754, por lo que un número máximo para usar es 17 + 3. Esto entra en el punto # 3 anterior. Es un poco profundo sobre cómo afecta esto a las cosas, pero solo lo notaré para aquellos que desean profundizar en una solución robusta portátil.

 
  1. It obviously does not handle NAN and INF. Maybe outside code's goals.

  2. Surprisingly does not handle exponential notation such as 1.23e+56.

  3. if(!isdigit(c) && c != '.') { returns a 0 implying "not a number" and ungets the offending c. But a potential + or - was all ready consumed and not available for alternative parsings. Not sure best way to handle, but maybe consider that once a non-white-space char is irrevocable consumed, this function should not return a error signal and should set *pf to _something_like 0 or NAN.

  4. Minor: The *pf /= power; approach fails with input such as 123.00000...(300+ zeros) as power or *pf already became INF.

  5. This is a pedantic point: Once you get about 17 (depends on double) decimal digits, the addition of (c - '0') to *pf * 10 becomes moot. To get a more accurate significand, forming the number right-to-left has precision advantages.

  6. The return c; could return 0 indicating "not a number" . Recommend an alternative return value scheme.

  7. ungetch is not in the C spec. Consider ungetc().

  8. With ungetc() "If the value of c equals that of the macro EOF, the operation fails and the input stream is unchanged." thus negating the need for the if(c != EOF). Still not bad to have there.

  9. The decimal point . is locale sensitive and could be , or something else. Use locale sensitive routines to determine the current decimal point.

  10. You are commended for for taking in "-0" and rendering -0.0 rather than 0.0.

  11. [Edit] IEEE_754-2008 Character_representation discusses the maximum number of non-zero leading digits to use when converting from text to a number. double is often a IEEE_754 binary64, so a maximum number to use is 17+3. This goes into point #3 above. Its a bit deep on how this affects things, but I'll just note it for those who want to delve into a portable robust solution.

 
 

Relacionados problema

15  Función de sine en C / C ++  ( Sine function in c c ) 
Debido a las restricciones de software, No puedo usar las bibliotecas estándar, cmath , 9988776655544334 , plantillas, en línea o impulso . También estoy u...

10  ¿Cómo aumentar la eficiencia de la operación de la matriz en C?  ( How to increase efficiency of matrix operation in c ) 
Tengo una matriz triangular superior n * n con propiedad de tal manera que, todos sus elementos diagonales son A1, A2, A3, ..., una. Quiero que un [I] [J] (pa...

3  Base64 String ↔ Array flotante  ( Base64 string %e2%86%94 float array ) 
Necesito convertir move constructor8 matrices con una longitud de fix a base64 Representación y atrás. Mi código actual se ve así. Funciona, pero se sient...

5  Implementar el análisis de STRTOD  ( Implement strtod parsing ) 
en este comentario la OP escribió, Soy un novato, así que me gustaría saber ¿Cómo me gustaría analizar los números / argumentos de Negetive? en Esta ...

0  Analizando una cadena en un doble  ( Parsing a string into a double ) 
Estoy tratando de entender la función strtod() , y cómo puedo manejar cualquier entrada de usuario que se le da a la función. Supongo que he probado por todo...

11  Análisis de flotadores separados por comas y comandos delimitados y delimitados punto y coma  ( Parsing comma separated floats and semicolon delimited commands ) 
Escribí un analizador cstring < Tiene que trabajar con una cantidad relativamente amplia de argumentos (generalmente 3 o 4, pero tal vez en el futuro con una...

5  Normalizar tipos de enteros a rango de flotador  ( Normalize integer types to float range ) 
Escribí dos funciones de plantilla para tomar un tipo de entero y emitir un $_POST3 en el rango dado. Una función toma enteros firmados y la otra toma enter...

4  Solucionador de ecuación cuadrática en C ++  ( Quadratic equation solver in c ) 
// ConsoleApplication1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <cstdlib> #include <iostream> #include <cm...

3  Lector / escritor de media precisión para C #  ( Half precision reader writer for c ) 
Estoy leyendo / escribiendo los números de punto flotante de media precisión en C #. Estos son básicamente flotadores de 16 bits, en comparación con los flota...

2  Resolviendo la ecuación cuadrática en Clojure  ( Solving quadratic equation in clojure ) 
Escribí una función en Clojure para resolver ecuaciones cuadráticas utilizando la fórmula cuadrática la función (defn solvequadeq [a b c] (let [D (-...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos