t-ops.cc
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:13k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /* Test mp*_class operators and functions.
  2. Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  14. #include "config.h"
  15. #include <iostream>
  16. #include "gmp.h"
  17. #include "gmpxx.h"
  18. #include "gmp-impl.h"
  19. #include "tests.h"
  20. using namespace std;
  21. void
  22. check_mpz (void)
  23. {
  24.   // unary operators and functions
  25.   // operator+
  26.   {
  27.     mpz_class a(1);
  28.     mpz_class b;
  29.     b = +a; ASSERT_ALWAYS(b == 1);
  30.   }
  31.   // operator-
  32.   {
  33.     mpz_class a(2);
  34.     mpz_class b;
  35.     b = -a; ASSERT_ALWAYS(b == -2);
  36.   }
  37.   // operator~
  38.   {
  39.     mpz_class a(3);
  40.     mpz_class b;
  41.     b = ~a; ASSERT_ALWAYS(b == -4);
  42.   }
  43.   // abs
  44.   {
  45.     mpz_class a(-123);
  46.     mpz_class b;
  47.     b = abs(a); ASSERT_ALWAYS(b == 123);
  48.   }
  49.   // sqrt
  50.   {
  51.     mpz_class a(25);
  52.     mpz_class b;
  53.     b = sqrt(a); ASSERT_ALWAYS(b == 5);
  54.   }
  55.   {
  56.     mpz_class a(125);
  57.     mpz_class b;
  58.     b = sqrt(a); ASSERT_ALWAYS(b == 11); // round toward zero
  59.   }
  60.   // sgn
  61.   {
  62.     mpz_class a(123);
  63.     int b = sgn(a); ASSERT_ALWAYS(b == 1);
  64.   }
  65.   {
  66.     mpz_class a(0);
  67.     int b = sgn(a); ASSERT_ALWAYS(b == 0);
  68.   }
  69.   {
  70.     mpz_class a(-123);
  71.     int b = sgn(a); ASSERT_ALWAYS(b == -1);
  72.   }
  73.   // binary operators and functions
  74.   // operator+
  75.   {
  76.     mpz_class a(1), b(2);
  77.     mpz_class c;
  78.     c = a + b; ASSERT_ALWAYS(c == 3);
  79.   }
  80.   {
  81.     mpz_class a(3);
  82.     signed int b = 4;
  83.     mpz_class c;
  84.     c = a + b; ASSERT_ALWAYS(c == 7);
  85.   }
  86.   {
  87.     mpz_class a(5);
  88.     double b = 6.0;
  89.     mpz_class c;
  90.     c = b + a; ASSERT_ALWAYS(c == 11);
  91.   }
  92.   // operator-
  93.   {
  94.     mpz_class a(3), b(6);
  95.     mpz_class c;
  96.     c = a - b; ASSERT_ALWAYS(c == -3);
  97.   }
  98.   // operator*
  99.   {
  100.     mpz_class a(-2), b(4);
  101.     mpz_class c;
  102.     c = a * b; ASSERT_ALWAYS(c == -8);
  103.   }
  104.   {
  105.     mpz_class a(2);
  106.     long b = -4;
  107.     mpz_class c;
  108.     c = a * b; ASSERT_ALWAYS(c == -8);
  109.     c = b * a; ASSERT_ALWAYS(c == -8);
  110.   }
  111.   {
  112.     mpz_class a(-2);
  113.     unsigned long b = 4;
  114.     mpz_class c;
  115.     c = a * b; ASSERT_ALWAYS(c == -8);
  116.     c = b * a; ASSERT_ALWAYS(c == -8);
  117.   }
  118.   // operator/ and operator%
  119.   {
  120.     mpz_class a(12), b(4);
  121.     mpz_class c;
  122.     c = a / b; ASSERT_ALWAYS(c == 3);
  123.     c = a % b; ASSERT_ALWAYS(c == 0);
  124.   }
  125.   {
  126.     mpz_class a(7), b(5);
  127.     mpz_class c;
  128.     c = a / b; ASSERT_ALWAYS(c == 1);
  129.     c = a % b; ASSERT_ALWAYS(c == 2);
  130.   }
  131.   {
  132.     mpz_class a(-10);
  133.     signed int ai = -10;
  134.     mpz_class b(3);
  135.     signed int bi = 3;
  136.     mpz_class c;
  137.     c = a / b;  ASSERT_ALWAYS(c == -3);
  138.     c = a % b;  ASSERT_ALWAYS(c == -1);
  139.     c = a / bi; ASSERT_ALWAYS(c == -3);
  140.     c = a % bi; ASSERT_ALWAYS(c == -1);
  141.     c = ai / b; ASSERT_ALWAYS(c == -3);
  142.     c = ai % b; ASSERT_ALWAYS(c == -1);
  143.   }
  144.   {
  145.     mpz_class a(-10);
  146.     signed int ai = -10;
  147.     mpz_class b(-3);
  148.     signed int bi = -3;
  149.     mpz_class c;
  150.     c = a / b;  ASSERT_ALWAYS(c == 3);
  151.     c = a % b;  ASSERT_ALWAYS(c == -1);
  152.     c = a / bi; ASSERT_ALWAYS(c == 3);
  153.     c = a % bi; ASSERT_ALWAYS(c == -1);
  154.     c = ai / b; ASSERT_ALWAYS(c == 3);
  155.     c = ai % b; ASSERT_ALWAYS(c == -1);
  156.   }
  157.   {
  158.     mpz_class a (LONG_MIN);
  159.     signed long ai = LONG_MIN;
  160.     mpz_class b = - mpz_class (LONG_MIN);
  161.     mpz_class c;
  162.     c = a / b;  ASSERT_ALWAYS(c == -1);
  163.     c = a % b;  ASSERT_ALWAYS(c == 0);
  164.     c = ai / b; ASSERT_ALWAYS(c == -1);
  165.     c = ai % b; ASSERT_ALWAYS(c == 0);
  166.   }
  167.   // operator&
  168.   // operator|
  169.   // operator^
  170.   // operator<<
  171.   {
  172.     mpz_class a(3);
  173.     unsigned int b = 4;
  174.     mpz_class c;
  175.     c = a << b; ASSERT_ALWAYS(c == 48);
  176.   }
  177.   // operator>>
  178.   {
  179.     mpz_class a(127);
  180.     unsigned int b = 4;
  181.     mpz_class c;
  182.     c = a >> b; ASSERT_ALWAYS(c == 7);
  183.   }
  184.   // operator==
  185.   // operator!=
  186.   // operator<
  187.   // operator<=
  188.   // operator>
  189.   // operator>=
  190.   // cmp
  191.   {
  192.     mpz_class a(123), b(45);
  193.     int c;
  194.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  195.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  196.   }
  197.   {
  198.     mpz_class a(123);
  199.     unsigned long b = 45;
  200.     int c;
  201.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  202.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  203.   }
  204.   {
  205.     mpz_class a(123);
  206.     long b = 45;
  207.     int c;
  208.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  209.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  210.   }
  211.   {
  212.     mpz_class a(123);
  213.     double b = 45;
  214.     int c;
  215.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  216.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  217.   }
  218.   // ternary operators
  219.   // mpz_addmul
  220.   {
  221.     mpz_class a(1), b(2), c(3);
  222.     mpz_class d;
  223.     d = a + b * c; ASSERT_ALWAYS(d == 7);
  224.   }
  225.   {
  226.     mpz_class a(1), b(2);
  227.     unsigned int c = 3;
  228.     mpz_class d;
  229.     d = a + b * c; ASSERT_ALWAYS(d == 7);
  230.   }
  231.   {
  232.     mpz_class a(1), b(3);
  233.     unsigned int c = 2;
  234.     mpz_class d;
  235.     d = a + c * b; ASSERT_ALWAYS(d == 7);
  236.   }
  237.   {
  238.     mpz_class a(1), b(2);
  239.     signed int c = 3;
  240.     mpz_class d;
  241.     d = a + b * c; ASSERT_ALWAYS(d == 7);
  242.   }
  243.   {
  244.     mpz_class a(1), b(3);
  245.     signed int c = 2;
  246.     mpz_class d;
  247.     d = a + c * b; ASSERT_ALWAYS(d == 7);
  248.   }
  249.   {
  250.     mpz_class a(1), b(2);
  251.     double c = 3.0;
  252.     mpz_class d;
  253.     d = a + b * c; ASSERT_ALWAYS(d == 7);
  254.   }
  255.   {
  256.     mpz_class a(1), b(3);
  257.     double c = 2.0;
  258.     mpz_class d;
  259.     d = a + c * b; ASSERT_ALWAYS(d == 7);
  260.   }
  261.   {
  262.     mpz_class a(2), b(3), c(4);
  263.     mpz_class d;
  264.     d = a * b + c; ASSERT_ALWAYS(d == 10);
  265.   }
  266.   {
  267.     mpz_class a(2), b(4);
  268.     unsigned int c = 3;
  269.     mpz_class d;
  270.     d = a * c + b; ASSERT_ALWAYS(d == 10);
  271.   }
  272.   {
  273.     mpz_class a(3), b(4);
  274.     unsigned int c = 2;
  275.     mpz_class d;
  276.     d = c * a + b; ASSERT_ALWAYS(d == 10);
  277.   }
  278.   {
  279.     mpz_class a(2), b(4);
  280.     signed int c = 3;
  281.     mpz_class d;
  282.     d = a * c + b; ASSERT_ALWAYS(d == 10);
  283.   }
  284.   {
  285.     mpz_class a(3), b(4);
  286.     signed int c = 2;
  287.     mpz_class d;
  288.     d = c * a + b; ASSERT_ALWAYS(d == 10);
  289.   }
  290.   {
  291.     mpz_class a(2), b(4);
  292.     double c = 3.0;
  293.     mpz_class d;
  294.     d = a * c + b; ASSERT_ALWAYS(d == 10);
  295.   }
  296.   {
  297.     mpz_class a(3), b(4);
  298.     double c = 2.0;
  299.     mpz_class d;
  300.     d = c * a + b; ASSERT_ALWAYS(d == 10);
  301.   }
  302.   // mpz_submul
  303.   {
  304.     mpz_class a(1), b(2), c(3);
  305.     mpz_class d;
  306.     d = a - b * c; ASSERT_ALWAYS(d == -5);
  307.   }
  308.   {
  309.     mpz_class a(1), b(2);
  310.     unsigned int c = 3;
  311.     mpz_class d;
  312.     d = a - b * c; ASSERT_ALWAYS(d == -5);
  313.   }
  314.   {
  315.     mpz_class a(1), b(3);
  316.     unsigned int c = 2;
  317.     mpz_class d;
  318.     d = a - c * b; ASSERT_ALWAYS(d == -5);
  319.   }
  320.   {
  321.     mpz_class a(1), b(2);
  322.     signed int c = 3;
  323.     mpz_class d;
  324.     d = a - b * c; ASSERT_ALWAYS(d == -5);
  325.   }
  326.   {
  327.     mpz_class a(1), b(3);
  328.     signed int c = 2;
  329.     mpz_class d;
  330.     d = a - c * b; ASSERT_ALWAYS(d == -5);
  331.   }
  332.   {
  333.     mpz_class a(1), b(2);
  334.     double c = 3.0;
  335.     mpz_class d;
  336.     d = a - b * c; ASSERT_ALWAYS(d == -5);
  337.   }
  338.   {
  339.     mpz_class a(1), b(3);
  340.     double c = 2.0;
  341.     mpz_class d;
  342.     d = a - c * b; ASSERT_ALWAYS(d == -5);
  343.   }
  344.   {
  345.     mpz_class a(2), b(3), c(4);
  346.     mpz_class d;
  347.     d = a * b - c; ASSERT_ALWAYS(d == 2);
  348.   }
  349.   {
  350.     mpz_class a(2), b(4);
  351.     unsigned int c = 3;
  352.     mpz_class d;
  353.     d = a * c - b; ASSERT_ALWAYS(d == 2);
  354.   }
  355.   {
  356.     mpz_class a(3), b(4);
  357.     unsigned int c = 2;
  358.     mpz_class d;
  359.     d = c * a - b; ASSERT_ALWAYS(d == 2);
  360.   }
  361.   {
  362.     mpz_class a(2), b(4);
  363.     signed int c = 3;
  364.     mpz_class d;
  365.     d = a * c - b; ASSERT_ALWAYS(d == 2);
  366.   }
  367.   {
  368.     mpz_class a(3), b(4);
  369.     signed int c = 2;
  370.     mpz_class d;
  371.     d = c * a - b; ASSERT_ALWAYS(d == 2);
  372.   }
  373.   {
  374.     mpz_class a(2), b(4);
  375.     double c = 3.0;
  376.     mpz_class d;
  377.     d = a * c - b; ASSERT_ALWAYS(d == 2);
  378.   }
  379.   {
  380.     mpz_class a(3), b(4);
  381.     double c = 2.0;
  382.     mpz_class d;
  383.     d = c * a - b; ASSERT_ALWAYS(d == 2);
  384.   }
  385. }
  386. void
  387. check_mpq (void)
  388. {
  389.   // unary operators and functions
  390.   // operator+
  391.   {
  392.     mpq_class a(1, 2);
  393.     mpq_class b;
  394.     b = +a; ASSERT_ALWAYS(b == 0.5);
  395.   }
  396.   // operator-
  397.   {
  398.     mpq_class a(3, 4);
  399.     mpq_class b;
  400.     b = -a; ASSERT_ALWAYS(b == -0.75);
  401.   }
  402.   // abs
  403.   {
  404.     mpq_class a(-123);
  405.     mpq_class b;
  406.     b = abs(a); ASSERT_ALWAYS(b == 123);
  407.   }
  408.   // sgn
  409.   {
  410.     mpq_class a(123);
  411.     int b = sgn(a); ASSERT_ALWAYS(b == 1);
  412.   }
  413.   {
  414.     mpq_class a(0);
  415.     int b = sgn(a); ASSERT_ALWAYS(b == 0);
  416.   }
  417.   {
  418.     mpq_class a(-123);
  419.     int b = sgn(a); ASSERT_ALWAYS(b == -1);
  420.   }
  421.   // binary operators and functions
  422.   // operator+
  423.   {
  424.     mpq_class a(1, 2), b(3, 4);
  425.     mpq_class c;
  426.     c = a + b; ASSERT_ALWAYS(c == 1.25);
  427.   }
  428.   {
  429.     mpq_class a(1, 2);
  430.     signed int b = 2;
  431.     mpq_class c;
  432.     c = a + b; ASSERT_ALWAYS(c == 2.5);
  433.   }
  434.   {
  435.     mpq_class a(1, 2);
  436.     double b = 1.5;
  437.     mpq_class c;
  438.     c = b + a; ASSERT_ALWAYS(c == 2);
  439.   }
  440.   // operator-
  441.   {
  442.     mpq_class a(1, 2), b(3, 4);
  443.     mpq_class c;
  444.     c = a - b; ASSERT_ALWAYS(c == -0.25);
  445.   }
  446.   // operator*
  447.   {
  448.     mpq_class a(1, 3), b(3, 4);
  449.     mpq_class c;
  450.     c = a * b; ASSERT_ALWAYS(c == 0.25);
  451.   }
  452.   // operator/
  453.   {
  454.     mpq_class a(1, 2), b(2, 3);
  455.     mpq_class c;
  456.     c = a / b; ASSERT_ALWAYS(c == 0.75);
  457.   }
  458.   // operator<<
  459.   // operator>>
  460.   // operator==
  461.   // operator!=
  462.   // operator<
  463.   // operator<=
  464.   // operator>
  465.   // operator>=
  466.   // cmp
  467.   {
  468.     mpq_class a(123), b(45);
  469.     int c;
  470.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  471.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  472.   }
  473.   {
  474.     mpq_class a(123);
  475.     unsigned long b = 45;
  476.     int c;
  477.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  478.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  479.   }
  480.   {
  481.     mpq_class a(123);
  482.     long b = 45;
  483.     int c;
  484.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  485.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  486.   }
  487.   {
  488.     mpq_class a(123);
  489.     double b = 45;
  490.     int c;
  491.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  492.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  493.   }
  494. }
  495. void
  496. check_mpf (void)
  497. {
  498.   // unary operators and functions
  499.   // operator+
  500.   {
  501.     mpf_class a(1);
  502.     mpf_class b;
  503.     b = +a; ASSERT_ALWAYS(b == 1);
  504.   }
  505.   // operator-
  506.   {
  507.     mpf_class a(2);
  508.     mpf_class b;
  509.     b = -a; ASSERT_ALWAYS(b == -2);
  510.   }
  511.   // abs
  512.   {
  513.     mpf_class a(-123);
  514.     mpf_class b;
  515.     b = abs(a); ASSERT_ALWAYS(b == 123);
  516.   }
  517.   // trunc
  518.   {
  519.     mpf_class a(1.5);
  520.     mpf_class b;
  521.     b = trunc(a); ASSERT_ALWAYS(b == 1);
  522.   }
  523.   {
  524.     mpf_class a(-1.5);
  525.     mpf_class b;
  526.     b = trunc(a); ASSERT_ALWAYS(b == -1);
  527.   }
  528.   // floor
  529.   {
  530.     mpf_class a(1.9);
  531.     mpf_class b;
  532.     b = floor(a); ASSERT_ALWAYS(b == 1);
  533.   }
  534.   {
  535.     mpf_class a(-1.1);
  536.     mpf_class b;
  537.     b = floor(a); ASSERT_ALWAYS(b == -2);
  538.   }
  539.   // ceil
  540.   {
  541.     mpf_class a(1.1);
  542.     mpf_class b;
  543.     b = ceil(a); ASSERT_ALWAYS(b == 2);
  544.   }
  545.   {
  546.     mpf_class a(-1.9);
  547.     mpf_class b;
  548.     b = ceil(a); ASSERT_ALWAYS(b == -1);
  549.   }
  550.   // sqrt
  551.   {
  552.     mpf_class a(25);
  553.     mpf_class b;
  554.     b = sqrt(a); ASSERT_ALWAYS(b == 5);
  555.   }
  556.   {
  557.     mpf_class a(2.25);
  558.     mpf_class b;
  559.     b = sqrt(a); ASSERT_ALWAYS(b == 1.5);
  560.   }
  561.   // sgn
  562.   {
  563.     mpf_class a(123);
  564.     int b = sgn(a); ASSERT_ALWAYS(b == 1);
  565.   }
  566.   {
  567.     mpf_class a(0);
  568.     int b = sgn(a); ASSERT_ALWAYS(b == 0);
  569.   }
  570.   {
  571.     mpf_class a(-123);
  572.     int b = sgn(a); ASSERT_ALWAYS(b == -1);
  573.   }
  574.   // binary operators and functions
  575.   // operator+
  576.   {
  577.     mpf_class a(1), b(2);
  578.     mpf_class c;
  579.     c = a + b; ASSERT_ALWAYS(c == 3);
  580.   }
  581.   // operator-
  582.   {
  583.     mpf_class a(3), b(4);
  584.     mpf_class c;
  585.     c = a - b; ASSERT_ALWAYS(c == -1);
  586.   }
  587.   // operator*
  588.   {
  589.     mpf_class a(2), b(5);
  590.     mpf_class c;
  591.     c = a * b; ASSERT_ALWAYS(c == 10);
  592.   }
  593.   // operator/
  594.   {
  595.     mpf_class a(7), b(4);
  596.     mpf_class c;
  597.     c = a / b; ASSERT_ALWAYS(c == 1.75);
  598.   }
  599.   // operator<<
  600.   // operator>>
  601.   // operator==
  602.   // operator!=
  603.   // operator<
  604.   // operator<=
  605.   // operator>
  606.   // operator>=
  607.   // hypot
  608.   {
  609.     mpf_class a(3), b(4);
  610.     mpf_class c;
  611.     c = hypot(a, b); ASSERT_ALWAYS(c == 5);
  612.   }
  613.   // cmp
  614.   {
  615.     mpf_class a(123), b(45);
  616.     int c;
  617.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  618.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  619.   }
  620.   {
  621.     mpf_class a(123);
  622.     unsigned long b = 45;
  623.     int c;
  624.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  625.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  626.   }
  627.   {
  628.     mpf_class a(123);
  629.     long b = 45;
  630.     int c;
  631.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  632.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  633.   }
  634.   {
  635.     mpf_class a(123);
  636.     double b = 45;
  637.     int c;
  638.     c = cmp(a, b); ASSERT_ALWAYS(c > 0);
  639.     c = cmp(b, a); ASSERT_ALWAYS(c < 0);
  640.   }
  641. }
  642. int
  643. main (void)
  644. {
  645.   tests_start();
  646.   check_mpz();
  647.   check_mpq();
  648.   check_mpf();
  649.   tests_end();
  650.   return 0;
  651. }