Этот код иллюстрирует проблему гораздо проще (извините за предыдущий, это слишком сложно). В любом случае, обратите внимание, что out_b будет правильно распечатываться для любых значений индекса от 0 до 958. Однако переменная out_a всегда будет распечатывать 36893488147419103232. И они оба типа DOUBLE. Похоже, операция «+» испортила тип out_a. Он не будет работать, даже если приложение имеет тип DOUBLE.Не может показаться, что здесь происходит
#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <string.h>
double main (int argc, char *argv[]) {
char *wrapper = "11111111111111111111111111111111111111111111111111111111111111111"; // 65 digits
int appendix = atoi(argv[1]);
int length = strlen(wrapper);
double out_a = gsl_pow_int(2,length) + appendix;
double out_b = gsl_pow_int(2,length + appendix);
printf("%.0lf %.0lf\n", out_a, out_b);
}
Оригинальный вопрос программы
Это C бы вычислить десятичный эквивалент в любой двоичный вход, до тех пор, как это меньше, чем 64 цифр ... Я не понимаю, почему. Любая помощь оценивается.
#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <string.h>
long double main (int argc, char *argv[]) {
char *wrapper = argv[1];
static int *array, length, llo, i;
static long double sum;
while (*wrapper && (*wrapper == '0')) wrapper++;
length = strlen(wrapper);
llo = length - 1;
array = malloc((length*sizeof(*array))+1);
for (i = 0; i < length; i++) {
if (wrapper[i] >= '0' && wrapper[i] <= '1') {
array[i] = wrapper[llo-i] - 48;
sum += array[i] * gsl_pow_int(2,i);
}
else printf("Some error.\n");
}
free(array);
printf("%.0Lf\n", sum);
}
Есть ли определенный раздел программы, о котором вы задавали вопрос? –
Вы пробовали переходить через код, по очереди, в отладчик? –
Может ли 2, поднятый к власти 64, храниться в целочисленной переменной? Я не уверен в этом. – Dinesh