Это ошибка в типах mpf_class?

Сегодня я натолкнулся на странную вещь, играя с классом данных mpf_class с более высокой точностью: кажется, что любое предварительное умножение, более одного раза, complex <mpf_class> возражать mpf_class Тип проблематичен, но однократное предварительное умножение хорошо, как и последующее умножение этих объектов на несколько mpf_class объекты:

#include <stlib.h>
#include <complex>
#include <gmpxx.h>

typedef  mpf_class my_float;
const my_float two("2.0",150);  //150 bit prec float

int main( int argc , char **argv )
{      
  mpf_set_default_prec(150); //default prec in bits

  complex<my_float> q1(my_float("5.268E-10"),my_float("8.789541E2"));
  complex<my_float> q2=two*q1;          //no problems
  complex<my_float> q3=q1*two;          //no problems
  complex<my_float> q3b=two*two*two;    //no problems
  complex<my_float> q4=two*q1*two;      //no problems
  complex<my_float> q5=q1*two*two;      //no problems
  //complex<my_float> q6=two*two*q1;    //!doesn't like!
  //complex<my_float> q7=(two*two)*q1;  //!doesn't like!
  complex<my_float> q8=-two*q1;         //!doesn't like!       

return 0;

}

Кажется, если вы предварительно умножаете complex из этих mpf_class объекты не раз вы попали в беду. Все же пост умножение прекрасно много раз. Аналогично умножение mpf_class Объекты между собой тоже подойдут столько раз, сколько захотите.

Что здесь происходит?

1 ответ

std::complex показывает хорошо определенное поведение только для T = float, double или long double. Если вы используете другие типы, поведение не определено.

Другие вопросы по тегам