182 return m_val / std::pow (
static_cast<T
> (10), exponent ());
189 octave::preserve_stream_state stream_state (os);
193 if (real_fmt.
width () >= 0)
197 os << std::setprecision (real_fmt.
precision ());
206 if (uppercase_format)
207 os << std::setw (0) <<
"E-";
209 os << std::setw (0) <<
"e-";
214 if (uppercase_format)
215 os << std::setw (0) <<
"E+";
217 os << std::setw (0) <<
"e+";
221 << std::setfill (
'0') << ex;
230 octave::preserve_stream_state stream_state (os);
234 if (real_fmt.
width () >= 0)
235 os << std::setw (real_fmt.
width ());
238 os << std::setprecision (real_fmt.
precision ());
251 octave::preserve_stream_state stream_state (os);
254 bool have_neg_sign = prf.
m_val < 0;
256 int fw = (rat_string_len > 0 ? rat_string_len : real_fmt.
width ());
265 os << std::setw (fw);
273 if (s.find (
'/') != std::string::npos)
275 if (s.length () > (
static_cast<unsigned int> (fw)))
282 if (s.length () > (
static_cast<unsigned int> (fw) - 2))
287 if (s.length () > (
static_cast<unsigned int> (fw) - 3))
308 T result = std::numeric_limits<T>::lowest ();
310 bool all_inf_or_nan =
true;
316 if (! octave::math::isfinite (val))
319 all_inf_or_nan =
false;
338 T result = std::numeric_limits<T>::max ();
340 bool all_inf_or_nan =
true;
346 if (! octave::math::isfinite (val))
349 all_inf_or_nan =
false;
362struct pr_output_traits
364 static const int DIGITS10;
365 static const int MAX_FIELD_WIDTH;
369struct pr_output_traits<
double>
371 static const int DIGITS10;
372 static const int MAX_FIELD_WIDTH;
375const int pr_output_traits<double>::DIGITS10 = 16;
376const int pr_output_traits<double>::MAX_FIELD_WIDTH = 21;
379struct pr_output_traits<
float>
381 static const int DIGITS10;
382 static const int MAX_FIELD_WIDTH;
385const int pr_output_traits<float>::DIGITS10 = 8;
386const int pr_output_traits<float>::MAX_FIELD_WIDTH = 13;
394make_real_format (
int digits,
bool inf_or_nan,
bool int_only)
400 int fw = 0, ld = 0, rd = 0;
407 else if (bank_format)
409 fw = (digits < 0 ? 4 : digits + 3);
439 rd = (prec > digits ? prec - digits : prec);
444 rd = (prec > digits ? prec - digits : prec);
449 rd = (prec > digits ? prec - 1 : prec);
455 if (! (rat_format || bank_format || hex_format || bit_format)
456 && (print_e || print_g || print_eng
457 || ld + rd > pr_output_traits<T>::DIGITS10
458 || fw > pr_output_traits<T>::MAX_FIELD_WIDTH
459 || ld + rd > (1.5 * prec)))
488 fmt =
float_format (fw, ex, prec - 1, std::ios::scientific);
492 else if (! bank_format && (inf_or_nan || int_only))
497 if (uppercase_format)
512 bool inf_or_nan = (octave::math::isinf (val) || octave::math::isnan (val));
514 bool int_only = (! inf_or_nan && octave::math::x_nint (val) == val);
516 T val_abs = (val < 0 ? -val : val);
518 int digits = (inf_or_nan || val_abs == 0) ? 0 : num_digits (val_abs);
520 return make_real_format<T> (digits, inf_or_nan, int_only);
539make_real_matrix_format (
int x_max,
int x_min,
bool inf_or_nan,
540 int int_or_inf_or_nan)
542 T
scale = ((x_max == 0 || int_or_inf_or_nan)
543 ? 1 : std::
pow (10.0, calc_scale_exp (x_max - 1)));
549 int fw = 0, ld = 0, rd = 0;
556 else if (bank_format)
558 int digits = (x_max > x_min ? x_max : x_min);
559 fw = (digits <= 0 ? 5 : digits + 4);
572 else if (Vfixed_point_format && ! print_g)
576 if (inf_or_nan && fw < 4)
579 else if (int_or_inf_or_nan)
581 int digits = (x_max > x_min ? x_max : x_min);
582 fw = (digits <= 0 ? 2 : digits + 1);
583 if (inf_or_nan && fw < 4)
593 rd_max = (prec > x_max ? prec - x_max : prec);
599 rd_max = (prec > x_max ? prec - x_max : prec);
605 rd_max = (prec > 1 ? prec - 1 : prec);
613 rd_min = (prec > x_min ? prec - x_min : prec);
619 rd_min = (prec > x_min ? prec - x_min : prec);
625 rd_min = (prec > 1 ? prec - 1 : prec);
629 ld = (ld_max > ld_min ? ld_max : ld_min);
630 rd = (rd_max > rd_min ? rd_max : rd_min);
632 fw = 1 + ld + 1 + rd;
633 if (inf_or_nan && fw < 4)
637 if (! (rat_format || bank_format || hex_format || bit_format)
638 && (print_e || print_eng || print_g
639 || (! Vfixed_point_format
640 && (ld + rd > pr_output_traits<T>::DIGITS10
641 || fw > pr_output_traits<T>::MAX_FIELD_WIDTH
642 || ld + rd > (1.5 * prec)))))
649 if (x_max > 100 || x_min > 100)
655 if (inf_or_nan && fw < 6)
662 if (inf_or_nan && fw < 4)
664 fmt =
float_format (fw, prec - 1, std::ios::scientific);
668 else if (! bank_format && int_or_inf_or_nan)
673 if (uppercase_format)
679template <
typename MT>
681make_matrix_format (
const MT& m)
689 bool inf_or_nan = m.any_element_is_inf_or_nan ();
691 bool int_or_inf_or_nan = m.all_elements_are_int_or_inf_or_nan ();
695 typedef typename MT::element_type ELT_T;
697 ELT_T max_abs = pr_max_internal (m_abs);
698 ELT_T min_abs = pr_min_internal (m_abs);
700 int x_max = ((inf_or_nan || max_abs == 0) ? 0 : num_digits (max_abs));
702 int x_min = ((inf_or_nan || min_abs == 0) ? 0 : num_digits (min_abs));
704 return make_real_matrix_format<ELT_T> (x_max, x_min, inf_or_nan,
712 return make_matrix_format (m);
719 return make_matrix_format (m);
724make_complex_format (
int x_max,
int x_min,
int r_x,
725 bool inf_or_nan,
int int_only)
732 int i_fw = 0, r_fw = 0, ld = 0, rd = 0;
740 else if (bank_format)
744 r_fw = (digits <= 0 ? 5 : digits + 4);
749 r_fw = 2 *
sizeof (T);
750 i_fw = 2 *
sizeof (T);
755 r_fw = 8 *
sizeof (T);
756 i_fw = 8 *
sizeof (T);
761 int digits = (x_max > x_min ? x_max : x_min);
762 i_fw = (digits <= 0 ? 1 : digits);
764 if (inf_or_nan && i_fw < 3)
777 rd_max = (prec > x_max ? prec - x_max : prec);
783 rd_max = (prec > x_max ? prec - x_max : prec);
789 rd_max = (prec > 1 ? prec - 1 : prec);
797 rd_min = (prec > x_min ? prec - x_min : prec);
803 rd_min = (prec > x_min ? prec - x_min : prec);
809 rd_min = (prec > 1 ? prec - 1 : prec);
813 ld = (ld_max > ld_min ? ld_max : ld_min);
814 rd = (rd_max > rd_min ? rd_max : rd_min);
818 if (inf_or_nan && i_fw < 3)
825 if (! (rat_format || bank_format || hex_format || bit_format)
826 && (print_e || print_eng || print_g
827 || ld + rd > pr_output_traits<T>::DIGITS10
828 || r_fw > pr_output_traits<T>::MAX_FIELD_WIDTH
829 || i_fw > pr_output_traits<T>::MAX_FIELD_WIDTH
830 || ld + rd > (1.5 * prec)))
834 int width = prec + 6;
841 if (x_max > 100 || x_min > 100)
846 i_fw = 3 + prec + ex;
848 if (inf_or_nan && i_fw < 5)
853 r_fmt =
float_format (r_fw, ex, prec - 1, std::ios::fixed);
854 i_fmt =
float_format (i_fw, ex, prec - 1, std::ios::fixed);
858 i_fw = 1 + prec + ex;
860 if (inf_or_nan && i_fw < 3)
865 r_fmt =
float_format (r_fw, prec - 1, std::ios::scientific);
866 i_fmt =
float_format (i_fw, prec - 1, std::ios::scientific);
870 if (uppercase_format)
876 else if (! bank_format && int_only)
900 bool r_inf_or_nan = (octave::math::isinf (rp) || octave::math::isnan (rp));
901 bool i_inf_or_nan = (octave::math::isinf (ip) || octave::math::isnan (ip));
902 bool inf_or_nan = r_inf_or_nan || i_inf_or_nan;
904 bool int_only = ((r_inf_or_nan || octave::math::x_nint (rp) == rp)
905 && (i_inf_or_nan || octave::math::x_nint (ip) == ip));
907 T r_abs = (rp < 0 ? -rp : rp);
908 T i_abs = (ip < 0 ? -ip : ip);
910 int r_x = ((r_inf_or_nan || r_abs == 0) ? 0 : num_digits (r_abs));
911 int i_x = ((i_inf_or_nan || i_abs == 0) ? 0 : num_digits (i_abs));
926 return make_complex_format<T> (x_max, x_min, r_x, inf_or_nan, int_only);
945make_complex_matrix_format (
int x_max,
int x_min,
int r_x_max,
946 int r_x_min,
bool inf_or_nan,
947 int int_or_inf_or_nan)
949 T
scale = ((x_max == 0 || int_or_inf_or_nan)
950 ? 1 : std::
pow (10.0, calc_scale_exp (x_max - 1)));
957 int i_fw = 0, r_fw = 0, ld = 0, rd = 0;
965 else if (bank_format)
967 int digits = (r_x_max > r_x_min ? r_x_max : r_x_min);
969 r_fw = (digits <= 0 ? 5 : digits + 4);
974 r_fw = 2 *
sizeof (T);
975 i_fw = 2 *
sizeof (T);
980 r_fw = 8 *
sizeof (T);
981 i_fw = 8 *
sizeof (T);
984 else if (Vfixed_point_format && ! print_g)
989 if (inf_or_nan && i_fw < 3)
995 else if (int_or_inf_or_nan)
997 int digits = (x_max > x_min ? x_max : x_min);
998 i_fw = (digits <= 0 ? 1 : digits);
1000 if (inf_or_nan && i_fw < 3)
1013 rd_max = (prec > x_max ? prec - x_max : prec);
1019 rd_max = (prec > x_max ? prec - x_max : prec);
1025 rd_max = (prec > 1 ? prec - 1 : prec);
1033 rd_min = (prec > x_min ? prec - x_min : prec);
1039 rd_min = (prec > x_min ? prec - x_min : prec);
1045 rd_min = (prec > 1 ? prec - 1 : prec);
1049 ld = (ld_max > ld_min ? ld_max : ld_min);
1050 rd = (rd_max > rd_min ? rd_max : rd_min);
1054 if (inf_or_nan && i_fw < 3)
1061 if (! (rat_format || bank_format || hex_format || bit_format)
1062 && (print_e || print_eng || print_g
1063 || (! Vfixed_point_format
1064 && (ld + rd > pr_output_traits<T>::DIGITS10
1065 || r_fw > pr_output_traits<T>::MAX_FIELD_WIDTH
1066 || i_fw > pr_output_traits<T>::MAX_FIELD_WIDTH
1067 || ld + rd > (1.5 * prec)))))
1071 int width = prec + 6;
1078 if (x_max > 100 || x_min > 100)
1083 i_fw = 3 + prec + ex;
1085 if (inf_or_nan && i_fw < 5)
1090 r_fmt =
float_format (r_fw, ex, prec - 1, std::ios::fixed);
1091 i_fmt =
float_format (i_fw, ex, prec - 1, std::ios::fixed);
1095 i_fw = 1 + prec + ex;
1097 if (inf_or_nan && i_fw < 3)
1102 r_fmt =
float_format (r_fw, prec - 1, std::ios::scientific);
1103 i_fmt =
float_format (i_fw, prec - 1, std::ios::scientific);
1107 if (uppercase_format)
1113 else if (! bank_format && int_or_inf_or_nan)
1127template <
typename CMT>
1129make_complex_matrix_format (
const CMT& cm)
1134 typedef typename CMT::real_matrix_type RMT;
1135 typedef typename CMT::real_elt_type ELT_T;
1140 bool inf_or_nan = cm.any_element_is_inf_or_nan ();
1142 bool int_or_inf_or_nan = (rp.all_elements_are_int_or_inf_or_nan ()
1143 && ip.all_elements_are_int_or_inf_or_nan ());
1145 RMT r_m_abs = rp.abs ();
1146 ELT_T r_max_abs = pr_max_internal (r_m_abs);
1147 ELT_T r_min_abs = pr_min_internal (r_m_abs);
1149 RMT i_m_abs = ip.abs ();
1150 ELT_T i_max_abs = pr_max_internal (i_m_abs);
1151 ELT_T i_min_abs = pr_min_internal (i_m_abs);
1153 int r_x_max = ((r_max_abs == 0 || octave::math::isinf (r_max_abs)
1154 || octave::math::isnan (r_max_abs))
1155 ? 0 : num_digits (r_max_abs));
1157 int r_x_min = ((r_min_abs == 0 || octave::math::isinf (r_min_abs)
1158 || octave::math::isnan (r_min_abs))
1159 ? 0 : num_digits (r_min_abs));
1161 int i_x_max = ((i_max_abs == 0 || octave::math::isinf (i_max_abs)
1162 || octave::math::isnan (i_max_abs))
1163 ? 0 : num_digits (i_max_abs));
1165 int i_x_min = ((i_min_abs == 0 || octave::math::isinf (i_min_abs)
1166 || octave::math::isnan (i_min_abs))
1167 ? 0 : num_digits (i_min_abs));
1169 int x_max = (r_x_max > i_x_max ? r_x_max : i_x_max);
1170 int x_min = (r_x_min > i_x_min ? r_x_min : i_x_min);
1172 return make_complex_matrix_format<ELT_T> (x_max, x_min, r_x_max, r_x_min,
1173 inf_or_nan, int_or_inf_or_nan);
1180 return make_complex_matrix_format (cm);
1187 return make_complex_matrix_format (cm);
1197template <
typename T>
1199make_range_format (
int x_max,
int x_min,
int all_ints)
1201 double scale = ((x_max == 0 || all_ints)
1202 ? 1 : std::
pow (10.0, calc_scale_exp (x_max - 1)));
1208 int fw = 0, ld = 0, rd = 0;
1215 else if (bank_format)
1217 int digits = (x_max > x_min ? x_max : x_min);
1218 fw = (digits < 0 ? 5 : digits + 4);
1221 else if (hex_format)
1223 fw = 2 *
sizeof (T);
1226 else if (bit_format)
1228 fw = 8 *
sizeof (T);
1233 int digits = (x_max > x_min ? x_max : x_min);
1237 else if (Vfixed_point_format && ! print_g)
1248 rd_max = (prec > x_max ? prec - x_max : prec);
1254 rd_max = (prec > x_max ? prec - x_max : prec);
1260 rd_max = (prec > 1 ? prec - 1 : prec);
1268 rd_min = (prec > x_min ? prec - x_min : prec);
1274 rd_min = (prec > x_min ? prec - x_min : prec);
1280 rd_min = (prec > 1 ? prec - 1 : prec);
1284 ld = (ld_max > ld_min ? ld_max : ld_min);
1285 rd = (rd_max > rd_min ? rd_max : rd_min);
1290 if (! (rat_format || bank_format || hex_format || bit_format)
1291 && (print_e || print_eng || print_g
1292 || (! Vfixed_point_format
1293 && (ld + rd > pr_output_traits<T>::DIGITS10
1294 || fw > pr_output_traits<T>::MAX_FIELD_WIDTH
1295 || ld + rd > (1.5 * prec)))))
1302 if (x_max > 100 || x_min > 100)
1308 fmt =
float_format (fw, ex, prec - 1, std::ios::fixed);
1313 fmt =
float_format (fw, prec - 1, std::ios::scientific);
1317 else if (! bank_format && all_ints)
1322 if (uppercase_format)
1335 double r_min = r.base ();
1336 double r_max = r.limit ();
1345 bool all_ints = r.all_elements_are_ints ();
1347 double max_abs = (r_max < 0 ? -r_max : r_max);
1348 double min_abs = (r_min < 0 ? -r_min : r_min);
1350 int x_max = ((max_abs == 0 || octave::math::isinf (max_abs)
1351 || octave::math::isnan (max_abs))
1352 ? 0 : num_digits (max_abs));
1354 int x_min = ((min_abs == 0 || octave::math::isinf (min_abs)
1355 || octave::math::isnan (min_abs))
1356 ? 0 : num_digits (min_abs));
1358 return make_range_format<double> (x_max, x_min, all_ints);
1361template <
typename T>
1365 unsigned char i[
sizeof (T)];
1368#define PRINT_CHAR_BITS(os, c) \
1371 unsigned char ctmp = c; \
1373 stmp[0] = (ctmp & 0x80) ? '1' : '0'; \
1374 stmp[1] = (ctmp & 0x40) ? '1' : '0'; \
1375 stmp[2] = (ctmp & 0x20) ? '1' : '0'; \
1376 stmp[3] = (ctmp & 0x10) ? '1' : '0'; \
1377 stmp[4] = (ctmp & 0x08) ? '1' : '0'; \
1378 stmp[5] = (ctmp & 0x04) ? '1' : '0'; \
1379 stmp[6] = (ctmp & 0x02) ? '1' : '0'; \
1380 stmp[7] = (ctmp & 0x01) ? '1' : '0'; \
1386#define PRINT_CHAR_BITS_SWAPPED(os, c) \
1389 unsigned char ctmp = c; \
1391 stmp[0] = (ctmp & 0x01) ? '1' : '0'; \
1392 stmp[1] = (ctmp & 0x02) ? '1' : '0'; \
1393 stmp[2] = (ctmp & 0x04) ? '1' : '0'; \
1394 stmp[3] = (ctmp & 0x08) ? '1' : '0'; \
1395 stmp[4] = (ctmp & 0x10) ? '1' : '0'; \
1396 stmp[5] = (ctmp & 0x20) ? '1' : '0'; \
1397 stmp[6] = (ctmp & 0x40) ? '1' : '0'; \
1398 stmp[7] = (ctmp & 0x80) ? '1' : '0'; \
1404template <
typename T>
1406pr_any_float (std::ostream& os,
const float_format& fmt, T val)
1414 int fw = fmt.
width ();
1418 octave::preserve_stream_state stream_state (os);
1428 octave::mach_info::float_format flt_fmt
1429 = octave::mach_info::native_float_format ();
1432 if (uppercase_format)
1433 os.flags (std::ios::right | std::ios::hex | std::ios::uppercase);
1435 os.flags (std::ios::right | std::ios::hex);
1438 || flt_fmt == octave::mach_info::flt_fmt_ieee_big_endian)
1440 for (std::size_t i = 0; i <
sizeof (T); i++)
1441 os << std::setw (2) <<
static_cast<int> (tmp.i[i]);
1445 for (
int i =
sizeof (T) - 1; i >= 0; i--)
1446 os << std::setw (2) <<
static_cast<int> (tmp.i[i]);
1449 else if (bit_format)
1454 octave::mach_info::float_format flt_fmt
1455 = octave::mach_info::native_float_format ();
1457 if (flt_fmt == octave::mach_info::flt_fmt_ieee_big_endian)
1459 for (std::size_t i = 0; i <
sizeof (T); i++)
1466 for (std::size_t i = 0; i <
sizeof (T); i++)
1471 for (
int i =
sizeof (T) - 1; i >= 0; i--)
1478 octave::preserve_stream_state stream_state (os);
1481 os << std::setw (fw) <<
"0";
1485 else if (octave::math::isna (val))
1487 octave::preserve_stream_state stream_state (os);
1490 os << std::setw (fw) <<
"NA";
1494 else if (rat_format)
1495 os << pr_rational_float<T> (fmt, val);
1496 else if (octave::math::isinf (val))
1498 octave::preserve_stream_state stream_state (os);
1507 os << std::setw (fw) << s;
1511 else if (octave::math::isnan (val))
1513 octave::preserve_stream_state stream_state (os);
1516 os << std::setw (fw) <<
"NaN";
1521 os << pr_engineering_float<T> (fmt, val);
1523 os << pr_formatted_float<T> (fmt, val);
1526template <
typename T>
1532 if (Vfixed_point_format && ! (print_g || print_e) &&
scale != 1)
1538template <
typename T>
1544 if (Vfixed_point_format && ! (print_g || print_e) &&
scale != 1)
1550template <
typename T>
1553 const std::complex<T>& cval)
1557 pr_float (os, fmt, r);
1562 if (! (hex_format || bit_format) && std::signbit (i))
1566 pr_imag_float (os, fmt, i);
1570 if (hex_format || bit_format)
1575 pr_imag_float (os, fmt, i);
1583 bool pr_as_read_syntax)
1587 if (pr_as_read_syntax)
1589 if (nr == 0 && nc == 0)
1592 os <<
"zeros (" << nr <<
", " << nc <<
')';
1599 os <<
'(' << nr <<
'x' << nc <<
')';
1604print_empty_nd_array (std::ostream& os,
const dim_vector& dims,
1605 bool pr_as_read_syntax)
1609 if (pr_as_read_syntax)
1610 os <<
"zeros (" << dims.
str (
',') <<
')';
1616 os <<
'(' << dims.
str () <<
')';
1621pr_scale_header (std::ostream& os,
double scale)
1623 if (Vfixed_point_format && ! (print_g || print_e) &&
scale != 1)
1625 octave::preserve_stream_state stream_state (os);
1628 << std::setw (8) << std::setprecision (1)
1629 << std::setiosflags (std::ios::scientific | std::ios::left)
1639pr_col_num_header (std::ostream& os,
octave_idx_type total_width,
int max_width,
1642 if (total_width > max_width && Vsplit_long_rows)
1644 octave::preserve_stream_state stream_state (os);
1656 os << std::setw (extra_indent) <<
"";
1659 os <<
" Column " << col + 1 <<
":\n";
1660 else if (num_cols == 2)
1661 os <<
" Columns " << col + 1 <<
" and " << lim <<
":\n";
1663 os <<
" Columns " << col + 1 <<
" through " << lim <<
":\n";
1670template <
typename T>
1672pr_plus_format (std::ostream& os,
const T& val)
1675 os << plus_format_chars[0];
1676 else if (val < T (0))
1677 os << plus_format_chars[1];
1679 os << plus_format_chars[2];
1688template <
typename T>
1692 return x < 0 ? -
x :
x;
1695#define INSTANTIATE_ABS(T) \
1703#define SPECIALIZE_UABS(T) \
1716#define MAKE_INT_MATRIX_FORMAT(TYPE) \
1718 float_display_format \
1719 make_format (const intNDArray<TYPE>& nda) \
1721 bool isneg = false; \
1724 for (octave_idx_type i = 0; i < nda.numel (); i++) \
1727 = static_cast<int> \
1728 (std::floor (log10 (double (abs (nda(i).value ()))) + 1)); \
1730 if (new_digits > digits) \
1731 digits = new_digits; \
1734 isneg = (abs (nda(i).value ()) != nda(i).value ()); \
1737 return float_display_format (float_format (digits + isneg, 0, 0)); \
1749#define MAKE_INT_SCALAR_FORMAT(TYPE) \
1751 float_display_format \
1752 make_format (const octave_int<TYPE>& val) \
1754 bool isneg = false; \
1756 = static_cast<int> \
1757 (std::floor (log10 (double (abs (val.value ()))) + 1)); \
1759 isneg = (abs (val.value ()) != val.value ()); \
1761 return float_display_format (float_format (digits + isneg, 0, 0)); \
1775 bool d,
bool pr_as_read_syntax)
1790 error (
"unexpected call to 'octave_print_internal (std::ostream&, const float_display_format&, char, bool)' - please report this bug");
1795 double d,
bool pr_as_read_syntax)
1797 if (pr_as_read_syntax)
1799 else if (plus_format)
1800 pr_plus_format (os,
d);
1806 pr_float (os, fmt,
d);
1812 float d,
bool pr_as_read_syntax)
1814 if (pr_as_read_syntax)
1816 else if (plus_format)
1817 pr_plus_format (os,
d);
1823 pr_float (os, fmt,
d);
1827template <
typename MT>
1829octave_print_free (std::ostream& os,
const MT& m,
bool pr_as_read_syntax)
1834 if (pr_as_read_syntax)
1840 os <<
' ' << m.elem (i, j);
1846 if (pr_as_read_syntax)
1850template <
typename MT>
1852pr_plus_format_matrix (std::ostream& os,
const MT& m)
1863 pr_plus_format (os, m(i, j));
1877 int retval = r_fw + i_fw + 2;
1879 if (i_fw && ! (rat_format || bank_format || hex_format || bit_format))
1885template <
typename MT>
1887octave_print_matrix_internal (std::ostream& os,
const MT& m,
1888 bool pr_as_read_syntax,
int extra_indent)
1893 if (nr == 0 || nc == 0)
1894 print_empty_matrix (os, nr, nc, pr_as_read_syntax);
1895 else if (plus_format && ! pr_as_read_syntax)
1896 pr_plus_format_matrix (os, m);
1900 int column_width = get_column_width (fmt);
1904 if (pr_as_read_syntax)
1907 max_width -= extra_indent;
1914 octave_print_free (os, m, pr_as_read_syntax);
1919 if (total_width > max_width && Vsplit_long_rows)
1921 inc = max_width / column_width;
1926 if (pr_as_read_syntax)
1939 if (i == 0 && j == 0)
1949 pr_float (os, fmt, m(i, j));
1968 octave::preserve_stream_state stream_state (os);
1976 pr_col_num_header (os, total_width, max_width, lim, col,
1981 os << std::setw (extra_indent) <<
"";
1989 pr_float (os, fmt, m(i, j));
2000template <
typename DMT>
2002octave_print_diag_matrix_internal (std::ostream& os,
const DMT& m,
2003 bool pr_as_read_syntax,
int extra_indent)
2008 if (nr == 0 || nc == 0)
2009 print_empty_matrix (os, nr, nc, pr_as_read_syntax);
2010 else if (plus_format && ! pr_as_read_syntax)
2011 pr_plus_format_matrix (os, m);
2015 =
make_format (
typename DMT::full_matrix_type (m.diag ()));
2016 int column_width = get_column_width (fmt);
2020 if (pr_as_read_syntax)
2023 max_width -= extra_indent;
2030 octave_print_free (os, m, pr_as_read_syntax);
2035 if (total_width > max_width && Vsplit_long_rows)
2037 inc = max_width / column_width;
2042 if (pr_as_read_syntax)
2065 pr_float (os, fmt, m(j, j));
2079 octave::preserve_stream_state stream_state (os);
2081 os <<
"Diagonal Matrix\n";
2090 std::ostringstream tmp_oss;
2091 typename DMT::element_type zero = 0;
2092 pr_float (tmp_oss, fmt, zero);
2093 zero_fw = tmp_oss.str ().length ();
2100 pr_col_num_header (os, total_width, max_width, lim, col,
2105 os << std::setw (extra_indent) <<
"";
2114 pr_float (os, fmt, m(i, j));
2116 os << std::setw (zero_fw) <<
'0';
2127template <
typename NDA_T,
typename ELT_T,
typename MAT_T>
2130 bool pr_as_read_syntax)
2134 print_empty_nd_array (os, nda.dims (), pr_as_read_syntax);
2138 int ndims = nda.ndims ();
2146 for (
int i = 2; i < ndims; i++)
2156 std::string nm =
"ans";
2162 std::ostringstream buf;
2164 for (
int k = 2; k < ndims; k++)
2179 idx(0) = octave::idx_vector (
':');
2180 idx(1) = octave::idx_vector (
':');
2182 for (
int k = 2; k < ndims; k++)
2183 idx(k) = octave::idx_vector (
ra_idx(k));
2198 NDA_T::increment_index (
ra_idx, dims, 2);
2205 bool pr_as_read_syntax,
int extra_indent)
2207 switch (nda.
ndims ())
2212 pr_as_read_syntax, extra_indent);
2216 print_nd_array <NDArray, double, Matrix> (os, nda, pr_as_read_syntax);
2223 bool pr_as_read_syntax,
int extra_indent)
2225 switch (nda.
ndims ())
2230 pr_as_read_syntax, extra_indent);
2234 print_nd_array <FloatNDArray, float, FloatMatrix> (os, nda, pr_as_read_syntax);
2239template <
typename T>
2241pr_plus_format (std::ostream& os,
const std::complex<T>& c)
2254 pr_plus_format (os, rp);
2261 const Complex& c,
bool pr_as_read_syntax)
2263 if (pr_as_read_syntax)
2265 else if (plus_format)
2266 pr_plus_format (os, c);
2272 pr_float (os, fmt, c);
2280 if (pr_as_read_syntax)
2282 else if (plus_format)
2283 pr_plus_format (os, c);
2289 pr_float (os, fmt, c);
2295 bool pr_as_read_syntax,
int extra_indent)
2300 if (nr == 0 || nc == 0)
2301 print_empty_matrix (os, nr, nc, pr_as_read_syntax);
2302 else if (plus_format && ! pr_as_read_syntax)
2303 pr_plus_format_matrix (os, m);
2307 int column_width = fw + 2;
2311 if (pr_as_read_syntax)
2314 max_width -= extra_indent;
2321 octave_print_free (os, m, pr_as_read_syntax);
2326 if (total_width > max_width && Vsplit_long_rows)
2328 inc = max_width / column_width;
2333 if (pr_as_read_syntax)
2373 octave::preserve_stream_state stream_state (os);
2375 os <<
"Permutation Matrix\n";
2383 pr_col_num_header (os, total_width, max_width, lim, col,
2388 os << std::setw (extra_indent) <<
"";
2396 os << std::setw (fw) << m(i, j);
2409 bool pr_as_read_syntax,
int extra_indent)
2411 switch (nda.
ndims ())
2416 pr_as_read_syntax, extra_indent);
2420 print_nd_array <ComplexNDArray, Complex, ComplexMatrix>
2421 (os, nda, pr_as_read_syntax);
2428 bool pr_as_read_syntax,
int extra_indent)
2430 switch (nda.
ndims ())
2435 pr_as_read_syntax, extra_indent);
2439 print_nd_array <FloatComplexNDArray, FloatComplex, FloatComplexMatrix>
2440 (os, nda, pr_as_read_syntax);
2449 bool pr_as_read_syntax,
int extra_indent)
2451 octave_print_matrix_internal (os, m, pr_as_read_syntax, extra_indent);
2456 bool pr_as_read_syntax,
int extra_indent)
2458 octave_print_matrix_internal (os, m, pr_as_read_syntax, extra_indent);
2463 bool pr_as_read_syntax,
int extra_indent)
2465 octave_print_diag_matrix_internal (os, m, pr_as_read_syntax, extra_indent);
2470 bool pr_as_read_syntax,
int extra_indent)
2472 octave_print_diag_matrix_internal (os, m, pr_as_read_syntax, extra_indent);
2477 bool pr_as_read_syntax,
int extra_indent)
2479 octave_print_matrix_internal (os, cm, pr_as_read_syntax, extra_indent);
2484 bool pr_as_read_syntax,
int extra_indent)
2486 octave_print_matrix_internal (os, cm, pr_as_read_syntax, extra_indent);
2491 bool pr_as_read_syntax,
int extra_indent)
2493 octave_print_diag_matrix_internal (os, cm, pr_as_read_syntax, extra_indent);
2498 bool pr_as_read_syntax,
int extra_indent)
2500 octave_print_diag_matrix_internal (os, cm, pr_as_read_syntax, extra_indent);
2505 bool pr_as_read_syntax,
int extra_indent)
2507 double base = r.base ();
2508 double increment = r.increment ();
2509 double limit = r.limit ();
2510 double final_value = r.final_value ();
2513 if (plus_format && ! pr_as_read_syntax)
2514 pr_plus_format_matrix (os, r);
2519 if (pr_as_read_syntax)
2523 os << base <<
" : ";
2525 os << increment <<
" : ";
2530 pr_float (os, fmt, base);
2534 pr_float (os, fmt, increment);
2537 pr_float (os, fmt, limit);
2542 octave::preserve_stream_state stream_state (os);
2544 int column_width = get_column_width (fmt);
2552 os <<
' ' << r.elem (i);
2557 if (total_width > max_width && Vsplit_long_rows)
2559 inc = max_width / column_width;
2564 max_width -= extra_indent;
2572 while (col < num_elem)
2577 pr_col_num_header (os, total_width, max_width, lim, col,
2580 os << std::setw (extra_indent) <<
"";
2590 val = base + i * increment;
2592 if (i == num_elem - 1)
2597 pr_float (os, fmt, val);
2608 bool pr_as_read_syntax,
2617 bool pr_as_read_syntax,
2620 switch (nda.
ndims ())
2625 pr_as_read_syntax, extra_indent);
2637 bool pr_as_read_syntax,
2645 if (pr_as_read_syntax && nstr > 1)
2656 if (pr_as_read_syntax)
2658 os <<
'"' << octave::undo_string_escapes (row) <<
'"';
2673 if (pr_as_read_syntax && nstr > 1)
2678 os <<
"sorry, printing char matrices not implemented yet\n";
2684 bool pr_as_read_syntax,
int extra_indent,
2687 switch (nda.
ndims ())
2692 pr_as_read_syntax, extra_indent, pr_as_string);
2696 print_nd_array <charNDArray, char, charMatrix> (os, nda,
2704 bool pr_as_read_syntax,
int extra_indent)
2713 bool pr_as_read_syntax,
int )
2719 print_empty_nd_array (os, nda.
dims (), pr_as_read_syntax);
2720 else if (nda.
numel () == 1)
2726 int ndims = nda.
ndims ();
2734 for (
int i = 2; i < ndims; i++)
2742 std::string nm =
"ans";
2748 std::ostringstream buf;
2750 for (
int k = 2; k < ndims; k++)
2765 idx(0) = octave::idx_vector (
':');
2766 idx(1) = octave::idx_vector (
':');
2768 for (
int k = 2; k < ndims; k++)
2769 idx(k) = octave::idx_vector (
ra_idx(k));
2786 os <<
" " << page(ii, jj);
2799template <
typename T>
2800class octave_print_conv
2803 typedef T print_conv_type;
2806#define PRINT_CONV(T1, T2) \
2809 octave_print_conv<T1> \
2812 typedef T2 print_conv_type; \
2820template <
typename T>
2822pr_int (std::ostream& os,
const T&
d,
int fw = 0)
2824 std::size_t sz =
d.byte_size ();
2825 const unsigned char *tmpi =
d.iptr ();
2835 octave::preserve_stream_state stream_state (os);
2838 if (uppercase_format)
2839 os.flags (std::ios::right | std::ios::hex | std::ios::uppercase);
2841 os.flags (std::ios::right | std::ios::hex);
2843 if (hex_format > 1 || octave::mach_info::words_big_endian ())
2845 for (std::size_t i = 0; i < sz; i++)
2846 os << std::setw (2) <<
static_cast<int> (tmpi[i]);
2850 for (
int i = sz - 1; i >= 0; i--)
2851 os << std::setw (2) <<
static_cast<int> (tmpi[i]);
2854 else if (bit_format)
2856 if (octave::mach_info::words_big_endian ())
2858 for (std::size_t i = 0; i < sz; i++)
2865 for (std::size_t i = 0; i < sz; i++)
2870 for (
int i = sz - 1; i >= 0; i--)
2877 octave::preserve_stream_state stream_state (os);
2879 os << std::setw (fw)
2880 <<
typename octave_print_conv<T>::print_conv_type (
d);
2911template <
typename T>
2918 pr_plus_format (os, val);
2922 os << typename octave_print_conv<octave_int<T>>::print_conv_type (val);
2927 pr_int (os, val, r_fmt.
width ());
2932#define PRINT_INT_SCALAR_INTERNAL(TYPE) \
2934 octave_print_internal (std::ostream& os, \
2935 const float_display_format& fmt, \
2936 const octave_int<TYPE>& val, bool dummy) \
2938 octave_print_internal_template (os, fmt, val, dummy); \
2950template <typename T>
2953 bool pr_as_read_syntax,
int extra_indent)
2959 print_empty_nd_array (os, nda.dims (), pr_as_read_syntax);
2960 else if (nda.numel () == 1)
2963 else if (plus_format && ! pr_as_read_syntax)
2965 int ndims = nda.ndims ();
2973 for (
int i = 2; i < ndims; i++)
2983 std::string nm =
"ans(:,:,";
2985 std::ostringstream buf;
2987 for (
int k = 2; k < ndims; k++)
3006 idx(0) = octave::idx_vector (
':');
3007 idx(1) = octave::idx_vector (
':');
3009 for (
int k = 2; k < ndims; k++)
3010 idx(k) = octave::idx_vector (
ra_idx(k));
3020 pr_plus_format (os, page(ii, jj));
3023 if ((ii < nr - 1) || (i < m -1))
3036 int ndims = nda.ndims ();
3044 for (
int i = 2; i < ndims; i++)
3052 fw = 2 * nda(0).byte_size ();
3053 else if (bit_format)
3054 fw = nda(0).nbits ();
3064 (std::floor (log10 (
double (abs (nda(i).value ()))) + 1));
3066 if (new_digits > digits)
3067 digits = new_digits;
3070 isneg = (abs (nda(i).value ()) != nda(i).value ());
3073 fw = digits + isneg;
3076 int column_width = fw + (rat_format ? 0 : (bank_format ? 5 : 2));
3078 int max_width = octave::command_editor::terminal_cols () - extra_indent;
3080 if (total_width > max_width && Vsplit_long_rows)
3082 inc = max_width / column_width;
3091 std::string nm =
"ans(:,:,";
3093 std::ostringstream buf;
3095 for (
int k = 2; k < ndims; k++)
3114 idx(0) = octave::idx_vector (
':');
3115 idx(1) = octave::idx_vector (
':');
3117 for (
int k = 2; k < ndims; k++)
3118 idx(k) = octave::idx_vector (
ra_idx(k));
3124 if (pr_as_read_syntax)
3133 os << typename octave_print_conv<T>::print_conv_type (page(ii, jj));
3138 if (pr_as_read_syntax)
3143 octave::preserve_stream_state stream_state (os);
3153 pr_col_num_header (os, total_width, max_width, lim, col,
3158 os << std::setw (extra_indent) <<
"";
3164 pr_int (os, page(ii, jj), fw);
3166 if ((ii < n_rows - 1) || (i < m -1))
3181#define PRINT_INT_ARRAY_INTERNAL(TYPE) \
3182 OCTINTERP_API void \
3183 octave_print_internal (std::ostream& os, const intNDArray<TYPE>& nda, \
3184 bool pr_as_read_syntax, int extra_indent) \
3186 octave_print_internal_template (os, nda, pr_as_read_syntax, extra_indent); \
3201 error (
"unexpected call to 'octave_print_internal (std::ostream&, const Cell&, bool, int, bool)' - please report this bug");
3207 error (
"unexpected call to 'octave_print_internal (std::ostream&, const octave_value&, bool)' - please report this bug");
3240 int nargin = args.length ();
3242 if (nargin < 1 || nargin > 2)
3248 error (
"rats: X must be numeric");
3254 if (arg.
ndims () > 2)
3264 rat_string_len = 13;
3266 rat_string_len = args(1).strict_int_value ();
3272 std::ostringstream buf;
3274 std::string s = buf.str ();
3276 std::list<std::string> lst;
3279 std::size_t s_len = s.length ();
3283 std::size_t m = s.find (
'\n', n);
3285 if (m == std::string::npos)
3287 lst.push_back (s.substr (n));
3292 lst.push_back (s.substr (n, m - n));
3336DEFUN (disp, args, nargout,
3337 classes: cell char
double function_handle int8 int16 int32 int64 logical single struct uint8 uint16 uint32 uint64
3362 if (args.length () != 1)
3373 std::ostringstream buf;
3382 classes: cell char
double function_handle int8 int16 int32 int64 logical single struct uint8 uint16 uint32 uint64
3403 if (args.length () != 2)
3415 error (
"fdisp: stream FID not open for writing");
3464 classes: cell char
double function_handle int8 int16 int32 int64 logical single struct uint8 uint16 uint32 uint64
3502 int nargin = args.length ();
3509 if (nargin < 1 || nargin > 2)
3515 name = args(1).xstring_value (
"NAME must be a string");
3530 bool print_newlines =
false;
3536 interp.feval (
"disp",
ovl (value));
3575 free_format =
false;
3576 plus_format =
false;
3578 bank_format =
false;
3586static std::string format_string (
"short");
3594 init_format_state ();
3596 format_string =
"short";
3598 uppercase_format =
false;
3626 std::string arg = argv[idx++];
3627 std::transform (arg.begin (), arg.end (), arg.begin (), tolower);
3629 if (arg ==
"default")
3632 init_format_state ();
3635 uppercase_format =
false;
3637 else if (arg ==
"short")
3640 init_format_state ();
3650 else if (arg ==
"g")
3652 init_format_state ();
3657 else if (arg ==
"eng")
3659 init_format_state ();
3667 else if (arg ==
"shorte")
3670 init_format_state ();
3674 else if (arg ==
"shortg")
3677 init_format_state ();
3681 else if (arg ==
"shorteng")
3684 init_format_state ();
3688 else if (arg ==
"long")
3691 init_format_state ();
3702 else if (arg ==
"g")
3708 else if (arg ==
"eng")
3717 else if (arg ==
"longe")
3720 init_format_state ();
3724 else if (arg ==
"longg")
3727 init_format_state ();
3731 else if (arg ==
"longeng")
3734 init_format_state ();
3738 else if (arg ==
"hex")
3741 init_format_state ();
3744 else if (arg ==
"native-hex")
3747 init_format_state ();
3750 else if (arg ==
"bit")
3753 init_format_state ();
3756 else if (arg ==
"native-bit")
3759 init_format_state ();
3762 else if (arg ==
"+" || arg ==
"plus")
3765 init_format_state ();
3771 if (arg.length () == 3)
3773 plus_format_chars = arg;
3778 plus_format_chars =
"+- ";
3781 plus_format_chars =
"+- ";
3783 else if (arg ==
"rat")
3786 init_format_state ();
3789 else if (arg ==
"bank")
3792 init_format_state ();
3795 else if (arg ==
"free")
3798 init_format_state ();
3801 else if (arg ==
"none")
3804 init_format_state ();
3807 else if (arg ==
"compact")
3809 else if (arg ==
"loose")
3811 else if (arg ==
"lowercase")
3812 uppercase_format =
false;
3813 else if (arg ==
"uppercase")
3814 uppercase_format =
true;
3816 error (
"format: unrecognized format state '%s'", arg.c_str ());
4046 int nargin = args.length ();
4050 int argc = nargin + 1;
4054 set_format_style (argc, argv);
4059 warning (
"format: cannot query and set format at the same time, ignoring set operation");
4062 retval(2) = (uppercase_format ?
"uppercase" :
"lowercase");
4067 retval(0) = format_string;
4132DEFUN (fixed_point_format, args, nargout,
4172 "fixed_point_format");
4175DEFUN (print_empty_dimensions, args, nargout,
4203 "print_empty_dimensions");
4206DEFUN (split_long_rows, args, nargout,
4246OCTAVE_END_NAMESPACE(octave)