Enviado em 16/03/2017 - 22:02h
Eae pessoal, estava fazendo um algoritmo pra ler os dados de um arquivo separado por vírgula, passar esses dados para uma matriz do tipo float para poder realizar contas com os dados do arquivo. Então usei a função fgets pra pegar cada linha e percorre-la de virgula em virgula, salvando os valores em uma variável (char) e depois convertendo essa variável para uma outra variável tipo float, mas a função atof() está modificando alguns valores na hora da conversão. Exemplo:#include<stdio.h> #include<stdlib.h> #include<math.h> #include<locale.h> #include<string.h> float** alocamatriz(float **m, int l, int c){ int cont; m=(float**)malloc(sizeof(float*)*l); for(cont=0;cont<l;cont++){ m[cont]=(float*)malloc(sizeof(float)*c); } return m; } int main(){ FILE *arq,*arquivo; char vetor[5000],*valor,*valor2,vetor2[5000]; float **m,ventomedio,soma=0,aux=-999.989990,vento,v,z; int l=0,c=0,cont,linha=0,coluna; //Leitura do coeficiente printf("Digite o valor de z:"); scanf("%f",&z); //Abertura do arquivo arq = fopen("Dados.txt","rt"); if(arq==NULL){ printf("Erro na abertura do arquivo!\n"); exit(0); } //Verificação do arquivo para saber o numero de linhas e colunas(Necessario na alocação da matriz) while (fgets(vetor, sizeof(vetor), arq)){ valor = strtok(vetor,","); while (valor != NULL){ valor = strtok(NULL, ","); if(l==0){ c++; } } l++; } //Alocação da matriz m=alocamatriz(m,l,c); fclose(arq); //Reabertura do arquivo arq = fopen("Dados.txt","rt"); if(arq==NULL){ printf("Erro na abertura do arquivo!\n"); exit(0); } //Passagem dos dados do arquivo para a matriz while (fgets(vetor2, sizeof(vetor2), arq)){ valor2=strtok(vetor2, ","); if(linha!=0){ m[linha][0]=atof(valor2); } coluna=1; while (valor2 != NULL){ valor2 = strtok(NULL, ","); if(linha!=0){ m[linha][coluna]=atof(valor2); //Revisar essa função } coluna++; } linha++; } // Calculo do vento medio, raiz(u^2+v^2) for(linha=1;linha<l;linha++){ if(m[linha][8]!=aux && m[linha][9]!=aux){ vento=sqrt(pow(m[linha][8],2)+pow(m[linha][9],2)); // raiz de u^2+v^2 soma=soma+vento; } } //Vento medio na altura de 3 metros ventomedio=soma/(l-1); //Cria o arquivo onde sera salvo o resultado arquivo=fopen("Resultado.txt","wt"); //Simulações for(cont=10;cont<=100;cont=cont+10){ v=ventomedio*(log(3/z)/log(cont/z)); fprintf(arquivo,"Vento medio a Altura de %dm: %f\n ",cont,v); } //Fecha os arquivos fclose(arq); fclose(arquivo); system("pause"); return 0; }
Enviado em 17/03/2017 - 00:35h
Você pode imprimir a precisão desejada:#include<stdio.h> int main(){ printf("%.2f\n", -999.99F); }
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <float.h> int main(){ char string [256] = {0}; char* end; errno = 0; scanf("%s", string); const double result = strtod(string, &end); if ((result == DBL_MIN || result == DBL_MAX) && errno != 0) { perror("Valor fora do limite"); } else if (end == string) { perror("Erro durante a conversão"); } else if (result > DBL_MAX) { perror("acima do limite superior"); } else if (result < DBL_MIN) { perror("abaixo do limite inferior"); } else if ('\0' != *end) { perror("Caracter extra na entrada"); } else { printf("%.2f\n", result); } }
Enviado em 17/03/2017 - 19:33h
Possivelmente é problema de precisão, induzido por causa de um sistema de numeração diferente do que você espera.Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
O Que Fazer Após Instalar Fedora 42
Debian 12 -- Errata - Correções de segurança
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
O FIM da minha distro predileta: ARCOLINUX ...que pena (6)
Copiar Layout do Teclado para aplicar em outra Distribuição (1)