Есть ли способ настроить функцию %d в fprintf для использования экспоненциальной записи при записи в текстовый файл?
Насколько я вижу, когда команда fprintf используется с %d, MATLAB решает использовать экспоненциальную запись, если число имеет больше цифр, чем 19. Эту ситуацию можно наблюдать с кодом, приведенным ниже.
%This code writes 1234567891234567936 to the text file. not = fopen('gemSonuc.txt','w'); a=123456789123456789; fprintf(not,'%d',a); %This code writes 1.234568e+19 to the text file. not = fopen('gemSonuc.txt','w'); a=12345678912345678912; fprintf(not,'%d',a);
Мой главный вопрос: есть ли способ настроить это цифровое правило?
Для получения дополнительной информации вот полный код:
%Constants combs = [8 15 16 32 64 128 213 256 367 512 971 1024 1912 2048 4096 8192 16384 32768 65536 ... 131072 262144 724411 1048576 1451480 2097152 3070075]; u = length(combs); step = zeros(10, u); % preallocating temp = 110592; %Calculating n=1; while(n<10) for i=1:u step(n+1, i) = temp*combs(i); end temp = step(n+1,u); n=n+1; end step(1,:) = combs; %Writing to a Text File not = fopen('gemSonuc.txt','w'); fprintf(not, 'Baslangic (2048 spec) = 110592\n'); for k=1:n for l=1:u fprintf(not,'%21d', step(k,l)); end fprintf(not, '\n'); end fclose(not); fprintf('end of process') %%%%%%%%%%%% Result written to the file: %%%%%%%%%%%% %Baslangic (2048 spec) = 110592 % 8 15 16 32 64 128 213 256 367 512 971 1024 1912 2048 4096 8192 16384 32768 65536 131072 262144 724411 1048576 1451480 2097152 3070075 % 884736 1658880 1769472 3538944 7077888 14155776 23556096 28311552 40587264 56623104 107384832 113246208 211451904 226492416 452984832 905969664 1811939328 3623878656 7247757312 14495514624 28991029248 80114061312 115964116992 160522076160 231928233984 339525734400 % 2716205875200 5092886016000 5432411750400 10864823500800 21729647001600 43459294003200 72318981427200 86918588006400 124605944524800 173837176012800 329679488102400 347674352025600 649173204172800 695348704051200 1390697408102400 2781394816204800 5562789632409600 11125579264819200 22251158529638400 44502317059276800 89004634118553600 245956176782438400 356018536474214400 492814812966912000 712037072948428800 1042369469038080000 % 8338955752304640000 1.563554e+19 1.667791e+19 3.335582e+19 6.671165e+19 1.334233e+20 2.220247e+20 2.668466e+20 3.825496e+20 5.336932e+20 1.012141e+21 1.067386e+21 1.993010e+21 2.134773e+21 4.269545e+21 8.539091e+21 1.707818e+22 3.415636e+22 6.831273e+22 1.366255e+23 2.732509e+23 7.551039e+23 1.093004e+24 1.512978e+24 2.186007e+24 3.200152e+24 % 2.560122e+25 4.800229e+25 5.120244e+25 1.024049e+26 2.048098e+26 4.096195e+26 6.816325e+26 8.192390e+26 1.174456e+27 1.638478e+27 3.107348e+27 3.276956e+27 6.118691e+27 6.553912e+27 1.310782e+28 2.621565e+28 5.243130e+28 1.048626e+29 2.097252e+29 4.194504e+29 8.389008e+29 2.318226e+30 3.355603e+30 4.644957e+30 6.711206e+30 9.824708e+30 % 7.859766e+31 1.473706e+32 1.571953e+32 3.143907e+32 6.287813e+32 1.257563e+33 2.092663e+33 2.515125e+33 3.605668e+33 5.030251e+33 9.539791e+33 1.006050e+34 1.878484e+34 2.012100e+34 4.024200e+34 8.048401e+34 1.609680e+35 3.219360e+35 6.438721e+35 1.287744e+36 2.575488e+36 7.117127e+36 1.030195e+37 1.426037e+37 2.060391e+37 3.016259e+37 % 2.413007e+38 4.524389e+38 4.826014e+38 9.652029e+38 1.930406e+39 3.860812e+39 6.424632e+39 7.721623e+39 1.106967e+40 1.544325e+40 2.928788e+40 3.088649e+40 5.767087e+40 6.177299e+40 1.235460e+41 2.470919e+41 4.941839e+41 9.883678e+41 1.976736e+42 3.953471e+42 7.906942e+42 2.185011e+43 3.162777e+43 4.378040e+43 6.325554e+43 9.260142e+43 % 7.408113e+44 1.389021e+45 1.481623e+45 2.963245e+45 5.926491e+45 1.185298e+46 1.972410e+46 2.370596e+46 3.398472e+46 4.741192e+46 8.991597e+46 9.482385e+46 1.770539e+47 1.896477e+47 3.792954e+47 7.585908e+47 1.517182e+48 3.034363e+48 6.068726e+48 1.213745e+49 2.427491e+49 6.708148e+49 9.709962e+49 1.344091e+50 1.941992e+50 2.842933e+50 % 2.274346e+51 4.264399e+51 4.548693e+51 9.097385e+51 1.819477e+52 3.638954e+52 6.055447e+52 7.277908e+52 1.043356e+53 1.455582e+53 2.760488e+53 2.911163e+53 5.435688e+53 5.822327e+53 1.164465e+54 2.328931e+54 4.657861e+54 9.315722e+54 1.863144e+55 3.726289e+55 7.452578e+55 2.059452e+56 2.981031e+56 4.126460e+56 5.962062e+56 8.728017e+56 % 6.982414e+57 1.309203e+58 1.396483e+58 2.792966e+58 5.585931e+58 1.117186e+59 1.859068e+59 2.234372e+59 3.203182e+59 4.468745e+59 8.474905e+59 8.937490e+59 1.668797e+60 1.787498e+60 3.574996e+60 7.149992e+60 1.429998e+61 2.859997e+61 5.719993e+61 1.143999e+62 2.287997e+62 6.322672e+62 9.151989e+62 1.266854e+63 1.830398e+63 2.679567e+63
Я хочу написать третью и четвертую строки таблицы (которые начинаются со значений 2716205875200 и 8338955752304640000) в экспоненциальной записи без изменения первой и второй строк. Вот почему я не использую %e или %g в коде frpintf.
Единственное решение, которое я нашел, это код, приведенный ниже:
for k=1:2 for l=1:u fprintf(not,'%21d', step(k,l)); end fprintf(not, '\n'); end for k=1+2:n for l=1:u fprintf(not,'%21e', step(k,l)); end fprintf(not, '\n'); end %%%%%%%%%%%% Result written to the file: %%%%%%%%%%%% %Baslangic (2048 spec) = 110592 % 8 15 16 32 64 128 213 256 367 512 971 1024 1912 2048 4096 8192 16384 32768 65536 131072 262144 724411 1048576 1451480 2097152 3070075 % 884736 1658880 1769472 3538944 7077888 14155776 23556096 28311552 40587264 56623104 107384832 113246208 211451904 226492416 452984832 905969664 1811939328 3623878656 7247757312 14495514624 28991029248 80114061312 115964116992 160522076160 231928233984 339525734400 % 2.716206e+12 5.092886e+12 5.432412e+12 1.086482e+13 2.172965e+13 4.345929e+13 7.231898e+13 8.691859e+13 1.246059e+14 1.738372e+14 3.296795e+14 3.476744e+14 6.491732e+14 6.953487e+14 1.390697e+15 2.781395e+15 5.562790e+15 1.112558e+16 2.225116e+16 4.450232e+16 8.900463e+16 2.459562e+17 3.560185e+17 4.928148e+17 7.120371e+17 1.042369e+18 % 8.338956e+18 1.563554e+19 1.667791e+19 3.335582e+19 6.671165e+19 1.334233e+20 2.220247e+20 2.668466e+20 3.825496e+20 5.336932e+20 1.012141e+21 1.067386e+21 1.993010e+21 2.134773e+21 4.269545e+21 8.539091e+21 1.707818e+22 3.415636e+22 6.831273e+22 1.366255e+23 2.732509e+23 7.551039e+23 1.093004e+24 1.512978e+24 2.186007e+24 3.200152e+24 % 2.560122e+25 4.800229e+25 5.120244e+25 1.024049e+26 2.048098e+26 4.096195e+26 6.816325e+26 8.192390e+26 1.174456e+27 1.638478e+27 3.107348e+27 3.276956e+27 6.118691e+27 6.553912e+27 1.310782e+28 2.621565e+28 5.243130e+28 1.048626e+29 2.097252e+29 4.194504e+29 8.389008e+29 2.318226e+30 3.355603e+30 4.644957e+30 6.711206e+30 9.824708e+30 % 7.859766e+31 1.473706e+32 1.571953e+32 3.143907e+32 6.287813e+32 1.257563e+33 2.092663e+33 2.515125e+33 3.605668e+33 5.030251e+33 9.539791e+33 1.006050e+34 1.878484e+34 2.012100e+34 4.024200e+34 8.048401e+34 1.609680e+35 3.219360e+35 6.438721e+35 1.287744e+36 2.575488e+36 7.117127e+36 1.030195e+37 1.426037e+37 2.060391e+37 3.016259e+37 % 2.413007e+38 4.524389e+38 4.826014e+38 9.652029e+38 1.930406e+39 3.860812e+39 6.424632e+39 7.721623e+39 1.106967e+40 1.544325e+40 2.928788e+40 3.088649e+40 5.767087e+40 6.177299e+40 1.235460e+41 2.470919e+41 4.941839e+41 9.883678e+41 1.976736e+42 3.953471e+42 7.906942e+42 2.185011e+43 3.162777e+43 4.378040e+43 6.325554e+43 9.260142e+43 % 7.408113e+44 1.389021e+45 1.481623e+45 2.963245e+45 5.926491e+45 1.185298e+46 1.972410e+46 2.370596e+46 3.398472e+46 4.741192e+46 8.991597e+46 9.482385e+46 1.770539e+47 1.896477e+47 3.792954e+47 7.585908e+47 1.517182e+48 3.034363e+48 6.068726e+48 1.213745e+49 2.427491e+49 6.708148e+49 9.709962e+49 1.344091e+50 1.941992e+50 2.842933e+50 % 2.274346e+51 4.264399e+51 4.548693e+51 9.097385e+51 1.819477e+52 3.638954e+52 6.055447e+52 7.277908e+52 1.043356e+53 1.455582e+53 2.760488e+53 2.911163e+53 5.435688e+53 5.822327e+53 1.164465e+54 2.328931e+54 4.657861e+54 9.315722e+54 1.863144e+55 3.726289e+55 7.452578e+55 2.059452e+56 2.981031e+56 4.126460e+56 5.962062e+56 8.728017e+56 % 6.982414e+57 1.309203e+58 1.396483e+58 2.792966e+58 5.585931e+58 1.117186e+59 1.859068e+59 2.234372e+59 3.203182e+59 4.468745e+59 8.474905e+59 8.937490e+59 1.668797e+60 1.787498e+60 3.574996e+60 7.149992e+60 1.429998e+61 2.859997e+61 5.719993e+61 1.143999e+62 2.287997e+62 6.322672e+62 9.151989e+62 1.266854e+63 1.830398e+63 2.679567e+63
Я хотел бы узнать, есть ли способ установить правило цифр для экспоненциальной записи, используя frpintf с% d или нет.
ПРИМЕЧАНИЕ.
Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech ,ME,M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.
Похоже, это может иметь какое-то отношение к flintmax, а это значит, что это никак не изменить. Это значение равно 2⁵³ для двойных чисел, что соответствует 9007199254740992 (то есть чуть менее 17 цифр). Если я попытаюсь написать больше цифр, моя копия Matlab начнет округлять. Я также наблюдаю преобразование в экспоненциальную запись на 20 цифрах. Спрятанный в большом документе для fprintf, вы можете найти это:
If you specify a conversion that does not fit the data, such as a text conversion for a numeric value, MATLAB overrides the specified conversion, and uses %e. Example: '%s' converts pi to 3.141593e+00.
Таким образом, очевидно, Matlab больше не считает такие большие значения целыми числами, что делает их не подходящими для флага d, что приводит к преобразованию в экспоненциальное.
Что вы можете сделать, так это либо выполнить предварительную обработку строки, либо динамически выбрать спецификацию формата на основе вашего значения. Вы можете либо сравнить с flintmax, либо использовать log10(), чтобы найти количество цифр. (Эти два не эквивалентны.)
СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ