Initially, the task was to find out certain values ​​from the input data stream and transfer them from Celsius to Fahrenheit. The goal was still achieved, but there was a problem. If the number of characters in a number exceeds 7, then the number is translated completely wrong. For example, when translating the number 44586487, 80255709 should be displayed, but output 80255712, as if the original number was 44586489. They dropped articles on limits.h and additional code, but I cannot understand how the problem is connected with this.

#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> int all(char c) { return !(isdigit(c) || c == ' ' || c == 'C' || c == '\n' || c == '-' || c == '+'); } float c_f(double c) { return (c * 9) / 5 + 32; } int tabn(char c) { return !(c == ' ' || c == '\n' || c == '\t' || c == '-' || c == '+'); } int main(void) { int symbol; float m = 0.0; float s = 0.0; int state = 0; float f = 0.0; float r = 0.0; long int l = 0; long int k = 0; while ((symbol = getchar()) != EOF) { switch (state) { case 0: if (symbol == ' ' || symbol == '\n' || symbol == '\t') { state = 0; } else if (symbol >= 'a' && symbol <= 'z') { state = 9; } else if (symbol == 'C') { state = 1; } else if (symbol >= 'A' && symbol <= 'Z') { state = 9; } else if (symbol >= '0' && symbol <= '9') { m = (s * 10) + (symbol - '0'); s = m; state = 1; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 1: if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 12; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 7; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 2: if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; printf("\n"); state = 7; } break; case 3: if (symbol == ' ' || symbol == '\t') { printf("%ld%s", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (tabn(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == '\n') { printf("%ld%s\n", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 7; } else if (symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } break; case 4: if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 5; } else if (all(symbol)) { state = 2; } else if (symbol == ' ' || symbol == '\t') { state = 12; } else if (symbol == '\n') { state = 7; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 5: if (symbol == ' ' || symbol == '\t') { printf("%ld%s", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (tabn(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == '\n') { printf("%ld%s\n", l, "F "); s = 0; m = 0; f = 0; r = 0; l = 0; state = 7; } else if (symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } break; case 6: if (isdigit(symbol)) { m = (s * 10) - (symbol - '0'); s = m; state = 10; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { state = 2; } else if (symbol == ' ' || symbol == '\t') { state = 13; } else if (symbol == '\n') { state = 4; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 7: if (symbol == ' ' || symbol == '\n' || symbol == '\t') { state = 7; } else if (symbol >= 'a' && symbol <= 'z') { state = 9; } else if (symbol == 'C') { state = 4; } else if (symbol >= 'A' && symbol <= 'Z') { state = 9; } else if (symbol >= '0' && symbol <= '9') { m = (s * 10) + (symbol - '0'); s = m; state = 4; } else if (symbol == '-') { state = 8; } else if (symbol == '+') { state = 0; } break; case 8: if (symbol >= '0' && symbol <= '9') { m = (s * 10) - (symbol - '0'); s = m; state = 6; } else if (symbol == ' ' || symbol == '\n' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 8; } else if (symbol >= 'a' && symbol <= 'z') { state = 9; } else if (symbol == 'C') { state = 8; } else if (symbol >= 'A' && symbol <= 'Z') { state = 9; } else if (symbol == '-') { state = 9; } else if (symbol == '+') { state = 0; } break; case 9: if (symbol == ' ' || symbol == '\n' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (symbol >= 'a' && symbol <= 'z') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol == 'C') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol >= 'A' && symbol <= 'Z') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol >= '0' && symbol <= '9') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } break; case 10: if (isdigit(symbol)) { m = (s * 10) - (symbol - '0'); s = m; state = 10; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } break; case 11: if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } else if (symbol == 'C') { f = round(c_f(s)); l = f; r = l; state = 3; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } break; case 12: if (symbol == 'C') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 1; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-' || symbol == '+') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 9; } else if (isdigit(symbol)) { m = (s * 10) + (symbol - '0'); s = m; state = 11; } break; case 13: if (symbol == 'C') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (all(symbol)) { s = 0; m = 0; f = 0; r = 0; l = 0; state = 2; } else if (symbol == ' ' || symbol == '\t') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 0; } else if (symbol == '\n') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 4; } else if (symbol == '-') { s = 0; m = 0; f = 0; r = 0; l = 0; state = 8; } else if (isdigit(symbol)) { m = (s * 10) - (symbol - '0'); s = m; state = 10; } else if (symbol == '+') { state = 0; } break; } } if (r != 0) { k = floor(round(r)); r = k; printf("%ld%s", k, "F\n"); } return 0; } 

http://ideone.com/0XS4H7

  • one
    Some kind of tin. I already wrote how to count normally. There is only %d to change %lf , no? - Qwertiy
  • one
    B-rr-r ... Describe the original problem. It feels like you're trying to solve it with your left foot through your right ear :) - PinkTux
  • one
    @Zealint Is it possible somewhere more in detail? No, if for some tricky hardware purposes - I understand, but for general purposes, so to speak? Where is the float better? As I read, double is also faster in the general case? - Harry
  • one
    @Harry, double cannot be faster in the general case, because, for example, if there is a lot of data and accuracy is not so important, then more floats will fit into the cache than double'of. The same question of matrix multiplication, which you recently raised: the block size can be doubled. Further, on video cards (I don’t know about completely new ones, but on regular ones exactly) the float will work faster. In short, I don’t know if the double program works faster in a normally written program. In short, there is no general universal answer, in each case there is one thing that works better. - Zealint
  • one
    @Zealint Last question - you do not want to ask a question about using float and double and answer it yourself? I think this would be very useful and instructive, especially since universities often provide false information. Personally, I would read with great interest ... - Harry

1 answer 1

Do not use float . Use double .

Float accuracy is not enough to cover the difference between these numbers. Plus, a large error in operations.

http://codepad.org/XUXBHmVa

 #include <stdio.h> int main(void) { float x = 44586487; float y = 44586489; printf("%f %f", x, y); return 0; } 
 44586488.000000 44586488.000000 
  • tried to do through double, still the same situation - Jully