7

When I do:

$Exp[$Times[$X9, $Subtract[$X1, 
        79.65469618540546`], $Divide[-66.89166439433642`, $Divide[
         110.36853933887411`, $X9]]]] /. {$Divide -> Divide, $Exp -> 
       Exp, $Subtract -> Subtract, $Times -> 
       Times, $X1 -> {-22.`, -22.`, -21.`, -21.`, -21.`, -21.`, -21.`, \
    -20.`, -20.`, -20.`, -19.`, -19.`, -19.`, -19.`, -18.`, -18.`, -17.`, \
    -17.`, -17.`, -16.`, -16.`, -16.`, -15.`, -15.`, -15.`, -15.`, -15.`, \
    -15.`, -14.`, -14.`, -14.`, -13.`, -13.`, -12.`, -12.`, -11.`, -11.`, \
    -11.`, -11.`, -11.`, -11.`, -11.`, -10.`, -10.`, -10.`, -9.`, -9.`, \
    -9.`, -9.`, -8.`, -8.`, -8.`, -8.`, -8.`, -7.`, -7.`, -7.`, -7.`, \
    -7.`, -7.`, -7.`, -6.`, -6.`, -6.`, -6.`, -6.`, -6.`, -6.`, -5.`, \
    -5.`, -5.`, -5.`, -5.`, -5.`, -4.`, -4.`, -4.`, -4.`, -4.`, -4.`, \
    -4.`, -4.`, -3.`, -3.`, -3.`, -3.`, -3.`, -3.`, -2.`, -2.`, -2.`, \
    -1.`, -1.`, -1.`, -1.`, -1.`, -1.`, -1.`, -1.`, -1.`, -1.`, 0.`, 0.`, 
        0.`, 0.`, 0.`, 0.`, 0.`, 1.`, 1.`, 1.`, 1.`, 1.`, 1.`, 2.`, 2.`, 
        2.`, 2.`, 2.`, 3.`, 3.`, 3.`, 4.`, 4.`, 4.`, 4.`, 4.`, 4.`, 4.`, 
        5.`, 5.`, 5.`, 5.`, 5.`, 5.`, 5.`, 5.`, 6.`, 6.`, 6.`, 6.`, 7.`, 
        7.`, 7.`, 7.`, 7.`, 7.`, 8.`, 8.`, 8.`, 8.`, 8.`, 8.`, 8.`, 9.`, 
        9.`, 9.`, 9.`, 9.`, 9.`, 9.`, 9.`, 9.`, 9.`, 10.`, 10.`, 10.`, 
        10.`, 10.`, 10.`, 11.`, 11.`, 11.`, 11.`, 11.`, 11.`, 11.`, 12.`, 
        12.`, 12.`, 12.`, 12.`, 12.`, 13.`, 13.`, 13.`, 13.`, 13.`, 13.`, 
        13.`, 13.`, 14.`, 14.`, 14.`, 14.`, 14.`, 14.`, 15.`, 15.`, 15.`, 
        15.`, 15.`, 15.`, 16.`, 16.`, 16.`, 16.`, 16.`, 16.`, 16.`, 16.`, 
        17.`, 17.`, 17.`, 17.`, 17.`, 18.`, 18.`, 18.`, 18.`, 18.`, 18.`, 
        18.`, 18.`, 18.`, 19.`, 19.`, 19.`, 19.`, 20.`, 20.`, 20.`, 20.`, 
        20.`, 20.`, 20.`, 21.`, 21.`, 21.`, 21.`, 22.`, 22.`, 22.`, 22.`, 
        22.`, 23.`, 23.`, 23.`, 23.`, 24.`, 24.`, 24.`, 24.`, 24.`, 24.`, 
        24.`, 24.`, 24.`, 24.`, 24.`, 24.`, 25.`, 25.`, 25.`, 25.`, 26.`, 
        26.`, 26.`, 26.`, 26.`, 26.`, 26.`, 26.`, 27.`, 27.`, 27.`, 27.`, 
        28.`, 28.`, 28.`, 28.`, 28.`, 28.`, 29.`, 29.`, 29.`, 30.`, 30.`, 
        30.`, 30.`, 31.`, 31.`, 31.`, 31.`, 31.`, 32.`, 32.`, 32.`, 33.`, 
        33.`, 34.`, 34.`, 34.`, 34.`, 34.`, 35.`, 35.`, 35.`, 35.`, 35.`, 
        35.`, 35.`, 36.`, 36.`, 36.`, 36.`, 36.`, 36.`, 36.`, 36.`, 37.`, 
        37.`, 37.`, 37.`, 37.`, 37.`, 37.`, 37.`, 38.`, 38.`, 38.`, 38.`, 
        38.`, 38.`, 39.`, 39.`, 39.`, 40.`, 40.`, 40.`, 40.`, 40.`, 40.`, 
        41.`, 41.`, 41.`, 41.`, 41.`, 41.`, 41.`, 41.`, 42.`, 42.`, 42.`, 
        42.`, 42.`, 42.`, 42.`, 42.`, 42.`, 43.`, 43.`, 43.`, 43.`, 43.`, 
        43.`, 43.`, 43.`, 43.`, 44.`, 44.`, 44.`, 44.`, 45.`, 45.`, 45.`, 
        45.`, 45.`, 46.`, 46.`, 46.`, 47.`, 47.`, 47.`, 47.`, 47.`, 47.`, 
        48.`, 48.`, 48.`, 48.`, 48.`, 48.`, 48.`, 48.`, 49.`, 49.`, 49.`, 
        49.`, 49.`, 49.`, 49.`, 49.`, 49.`, 49.`, 50.`, 50.`, 50.`, 50.`, 
        50.`, 50.`, 50.`, 50.`, 51.`, 51.`, 51.`, 51.`, 51.`, 51.`, 52.`, 
        52.`, 52.`, 52.`, 52.`, 52.`, 52.`, 52.`, 52.`, 52.`, 53.`, 53.`, 
        53.`, 53.`, 53.`, 53.`, 53.`, 54.`, 54.`, 54.`, 54.`, 54.`, 55.`, 
        55.`, 55.`, 55.`, 55.`, 55.`, 55.`, 56.`, 56.`, 56.`, 56.`, 57.`, 
        57.`, 57.`, 57.`, 57.`, 57.`, 57.`, 57.`, 57.`, 58.`, 58.`, 58.`, 
        58.`, 58.`, 58.`, 58.`, 58.`, 58.`, 58.`, 59.`, 59.`, 59.`, 59.`, 
        59.`, 59.`, 60.`, 60.`, 60.`, 60.`, 60.`, 60.`, 61.`, 61.`, 61.`, 
        61.`, 62.`, 62.`, 62.`, 62.`, 62.`, 62.`, 62.`, 62.`, 63.`, 63.`, 
        63.`, 63.`, 63.`, 63.`, 63.`, 63.`, 63.`, 63.`, 64.`, 64.`, 64.`, 
        64.`, 64.`, 65.`, 65.`, 66.`, 66.`, 66.`, 67.`, 67.`, 67.`, 67.`, 
        67.`, 67.`, 68.`, 68.`, 68.`, 68.`, 68.`, 68.`, 68.`, 69.`, 69.`, 
        69.`, 69.`, 69.`, 70.`, 70.`, 70.`, 70.`, 71.`, 72.`, 72.`, 73.`, 
        73.`, 73.`, 73.`, 74.`, 74.`, 74.`, 74.`, 74.`, 75.`, 75.`, 75.`, 
        75.`, 75.`, 76.`, 76.`, 76.`, 76.`, 76.`, 76.`, 77.`, 77.`, 77.`, 
        77.`, 78.`, 78.`, 78.`, 78.`, 78.`, 78.`, 78.`, 78.`, 78.`, 78.`, 
        78.`, 78.`, 78.`, 79.`, 79.`, 79.`, 79.`, 79.`, 79.`, 79.`, 79.`, 
        79.`, 79.`, 80.`, 80.`, 80.`, 80.`, 80.`, 81.`, 81.`, 81.`, 81.`, 
        82.`, 82.`, 83.`, 83.`}, $X9 -> {2028.`, 2002.`, 1987.`, 1959.`, 
        1977.`, 1996.`, 2044.`, 1979.`, 1950.`, 2038.`, 1989.`, 2012.`, 
        1933.`, 2061.`, 1942.`, 1956.`, 2015.`, 1946.`, 1974.`, 2073.`, 
        1986.`, 2050.`, 1984.`, 2039.`, 1951.`, 1906.`, 2030.`, 2049.`, 
        1993.`, 1990.`, 2057.`, 2029.`, 2019.`, 2017.`, 2004.`, 2045.`, 
        2013.`, 2004.`, 2050.`, 2023.`, 2023.`, 1946.`, 1916.`, 2065.`, 
        1997.`, 2038.`, 2042.`, 2057.`, 2015.`, 2049.`, 1952.`, 1986.`, 
        2036.`, 2020.`, 1983.`, 2037.`, 1998.`, 1970.`, 2021.`, 1979.`, 
        2042.`, 2013.`, 1903.`, 1960.`, 1976.`, 2025.`, 1965.`, 2029.`, 
        2056.`, 1876.`, 1977.`, 2074.`, 2057.`, 2070.`, 1988.`, 2054.`, 
        2011.`, 1998.`, 1933.`, 1978.`, 2007.`, 2064.`, 1941.`, 2036.`, 
        2054.`, 2030.`, 2057.`, 2019.`, 1965.`, 1992.`, 1973.`, 1985.`, 
        2049.`, 2024.`, 2059.`, 2008.`, 2013.`, 1975.`, 2072.`, 1960.`, 
        2006.`, 2021.`, 2020.`, 1967.`, 2071.`, 1946.`, 2076.`, 1956.`, 
        1990.`, 1977.`, 1975.`, 2013.`, 1980.`, 2084.`, 2016.`, 2005.`, 
        1970.`, 1900.`, 1945.`, 2042.`, 1967.`, 2001.`, 2024.`, 1960.`, 
        2011.`, 1986.`, 2025.`, 2012.`, 1998.`, 1892.`, 2085.`, 2046.`, 
        1949.`, 1961.`, 2065.`, 2098.`, 2012.`, 1950.`, 1948.`, 1997.`, 
        1976.`, 2027.`, 2010.`, 1989.`, 1971.`, 2001.`, 1896.`, 1945.`, 
        1958.`, 1992.`, 1939.`, 2012.`, 2075.`, 2114.`, 1995.`, 2065.`, 
        2030.`, 2062.`, 1967.`, 1947.`, 2019.`, 2075.`, 1908.`, 2024.`, 
        1918.`, 1911.`, 2051.`, 2005.`, 1983.`, 2037.`, 2060.`, 2018.`, 
        2007.`, 1980.`, 1967.`, 2083.`, 1993.`, 1998.`, 1973.`, 2026.`, 
        2006.`, 2140.`, 2045.`, 2012.`, 2049.`, 1980.`, 2015.`, 2003.`, 
        2027.`, 2072.`, 1938.`, 2114.`, 2005.`, 2089.`, 2035.`, 2016.`, 
        1988.`, 1919.`, 1997.`, 2079.`, 2017.`, 1975.`, 1923.`, 2067.`, 
        2003.`, 1993.`, 1938.`, 1950.`, 1978.`, 2039.`, 2000.`, 2009.`, 
        1981.`, 1946.`, 2012.`, 1965.`, 2065.`, 2036.`, 1968.`, 2041.`, 
        2015.`, 1981.`, 1997.`, 1968.`, 2048.`, 2021.`, 1967.`, 2042.`, 
        1972.`, 2041.`, 1922.`, 2024.`, 2005.`, 1934.`, 1996.`, 2053.`, 
        1930.`, 1970.`, 1981.`, 2055.`, 2005.`, 2038.`, 2029.`, 2024.`, 
        2012.`, 2048.`, 1987.`, 1999.`, 1980.`, 2008.`, 1981.`, 1930.`, 
        2000.`, 1985.`, 2014.`, 2063.`, 1998.`, 2031.`, 1980.`, 2031.`, 
        2002.`, 1994.`, 1930.`, 1998.`, 1982.`, 2051.`, 1961.`, 2098.`, 
        2058.`, 1963.`, 1972.`, 1916.`, 2049.`, 2081.`, 2066.`, 2045.`, 
        2034.`, 2017.`, 2011.`, 2030.`, 2003.`, 2002.`, 2012.`, 2046.`, 
        1995.`, 2028.`, 2037.`, 2001.`, 1993.`, 1960.`, 2022.`, 2017.`, 
        1915.`, 1982.`, 2028.`, 2031.`, 1980.`, 1991.`, 2030.`, 2008.`, 
        1939.`, 2062.`, 2046.`, 1989.`, 2009.`, 2030.`, 2089.`, 2015.`, 
        1939.`, 1995.`, 1915.`, 1979.`, 1988.`, 2003.`, 1953.`, 1921.`, 
        1989.`, 1976.`, 2062.`, 1920.`, 2074.`, 1927.`, 1925.`, 1976.`, 
        2029.`, 2064.`, 2006.`, 2106.`, 2088.`, 1985.`, 1986.`, 1997.`, 
        2016.`, 2026.`, 2063.`, 2003.`, 2059.`, 1985.`, 1898.`, 2035.`, 
        1993.`, 2013.`, 1990.`, 2027.`, 1965.`, 2051.`, 1942.`, 2028.`, 
        1957.`, 1943.`, 2046.`, 2030.`, 2031.`, 1968.`, 2010.`, 1945.`, 
        2014.`, 2025.`, 2012.`, 1971.`, 2026.`, 2090.`, 1985.`, 1998.`, 
        2044.`, 1999.`, 1889.`, 1903.`, 1978.`, 2077.`, 1998.`, 1994.`, 
        2027.`, 2036.`, 2035.`, 1927.`, 1961.`, 1972.`, 1944.`, 2027.`, 
        1962.`, 2037.`, 2033.`, 2029.`, 1957.`, 2007.`, 1953.`, 2055.`, 
        1952.`, 2037.`, 2065.`, 2064.`, 2011.`, 2020.`, 2030.`, 1983.`, 
        2002.`, 1955.`, 2056.`, 1984.`, 2038.`, 1951.`, 1953.`, 2059.`, 
        2032.`, 1970.`, 1928.`, 1997.`, 2048.`, 2040.`, 2064.`, 2017.`, 
        2039.`, 1989.`, 1978.`, 2016.`, 1940.`, 2009.`, 2029.`, 1987.`, 
        1956.`, 2020.`, 1994.`, 1957.`, 2029.`, 1953.`, 2035.`, 2057.`, 
        2052.`, 2009.`, 2009.`, 2001.`, 2049.`, 1968.`, 1922.`, 2051.`, 
        1991.`, 2041.`, 1968.`, 1997.`, 2040.`, 2016.`, 1963.`, 1955.`, 
        2001.`, 2039.`, 2053.`, 1996.`, 1932.`, 2038.`, 1988.`, 2061.`, 
        1938.`, 2000.`, 2027.`, 2030.`, 1982.`, 1920.`, 2029.`, 1986.`, 
        2041.`, 2013.`, 2003.`, 2013.`, 2007.`, 2020.`, 1932.`, 2002.`, 
        1959.`, 1985.`, 1959.`, 1999.`, 1969.`, 2075.`, 1980.`, 1995.`, 
        1963.`, 1964.`, 1957.`, 2015.`, 2012.`, 2040.`, 2124.`, 2073.`, 
        2058.`, 1991.`, 2048.`, 2053.`, 2086.`, 2002.`, 2024.`, 2011.`, 
        1964.`, 2041.`, 1921.`, 2004.`, 2018.`, 2048.`, 1999.`, 2120.`, 
        1993.`, 1965.`, 2068.`, 1966.`, 2027.`, 2037.`, 2009.`, 1999.`, 
        2006.`, 2001.`, 2052.`, 2011.`, 2025.`, 2012.`, 2027.`, 1982.`, 
        1981.`, 1921.`, 2095.`, 1967.`, 2049.`, 2004.`, 2000.`, 1993.`, 
        2009.`, 2034.`, 1963.`, 2050.`, 1940.`, 2067.`, 1959.`, 1974.`, 
        1984.`, 1945.`, 2012.`, 2087.`, 1961.`, 2009.`, 2016.`, 1996.`, 
        1987.`, 1966.`, 1965.`, 2033.`, 1990.`, 2053.`, 1985.`, 2091.`, 
        2002.`, 2010.`, 1990.`, 1944.`, 2065.`, 2015.`, 2006.`, 2002.`, 
        1997.`, 2031.`, 1959.`, 1987.`, 2022.`, 2017.`, 1984.`, 1989.`, 
        1968.`, 2082.`, 2047.`, 2048.`, 2002.`, 2033.`, 2063.`, 1970.`, 
        1970.`, 1971.`, 1937.`, 1920.`, 2066.`, 1955.`, 1992.`, 2103.`, 
        2076.`, 1921.`, 2065.`, 2076.`, 1970.`, 2028.`, 1981.`, 1989.`, 
        1997.`, 1964.`, 2132.`, 2069.`, 1925.`, 1986.`, 2033.`, 1981.`, 
    1965.`, 1996.`, 1916.`, 1976.`}}

I get:

    {Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, Inf`, \
    Inf`, Inf`, Inf`, Inf`, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., \
0., 0.}

Where the "Inf" is an actual symbol (followed by an actual "'").

However when I do a truncated version of the above:

$Exp[$Times[$X9, $Subtract[$X1, 
    79.65469618540546`], $Divide[-66.89166439433642`, $Divide[
     110.36853933887411`, $X9]]]] /. {$Divide -> Divide, $Exp -> 
   Exp, $Subtract -> Subtract, $Times -> 
   Times, $X1 -> {-22.`, -22.`, -21.`, -21.`, -21.`, -21.`, -21.`, \
-20.`, -20.`, -20.`, -19.`, -19.`, -19.`, -19.`, -18.`, -18.`, -17.`, \
-17.`, -17.`, -16.`, -16.`, 78.`, 78.`, 79.`, 79.`, 79.`, 79.`, 79.`, 
    79.`, 79.`, 79.`, 79.`, 79.`, 80.`, 80.`, 80.`, 80.`, 80.`, 81.`, 
    81.`, 81.`, 81.`, 82.`, 82.`, 83.`, 83.`}, $X9 -> {2028.`, 2002.`,
     1987.`, 1959.`, 1977.`, 1996.`, 2044.`, 1979.`, 1950.`, 2038.`, 
    1989.`, 2012.`, 1933.`, 2061.`, 1942.`, 1956.`, 2015.`, 1946.`, 
    1974.`, 2073.`, 1986.`,
    1920.`, 2066.`, 1955.`, 1992.`, 2103.`, 2076.`, 1921.`, 2065.`, 
    2076.`, 1970.`, 2028.`, 1981.`, 1989.`, 1997.`, 1964.`, 2132.`, 
    2069.`, 1925.`, 1986.`, 2033.`, 1981.`, 1965.`, 1996.`, 1916.`, 
    1976.`}}

I get typical MMA answers.

Any idea of what might be going on?

This is MMA 12.3.1 on Windows 10. I have reported it to Wolfram.

Michael E2
  • 235,386
  • 17
  • 334
  • 747
berniethejet
  • 1,417
  • 1
  • 12
  • 13
  • 2
    Whatever causes this doesn't reproduce in my machine on v13.0 or later. I can reproduce it on v12.2 (might be there on earlier versions too) to v12.3.1. – kirma Mar 26 '23 at 02:23
  • 2
    I beileve it is underflow/overflow at machine precision. Doesn't happen on my Mac M1. Try SetSystemOptions["PackedArrayOptions" -> {"ListableAutoPackLength" -> 750}] (works on linux/wolframcloud) – Michael E2 Mar 26 '23 at 02:34
  • 1
    Related: https://mathematica.stackexchange.com/questions/19026/passing-back-nan-and-inf-to-c-via-mathlink – Michael E2 Mar 26 '23 at 17:11
  • I see the same issue on v13.2, AMD CPU, Windows 10. Reported as CASE:5016456. – berniethejet Apr 09 '23 at 21:04

3 Answers3

5

Update: Kinda found the parameter for the second threshold

Here is how the bug manifests itself on Linux (WolframCloud), V13.2.0., on an Intel cpu. (This does not happen on my Mac M1 Max.)

It is connected with automatic vectorization. There seem to be two thresholds. One is controlled by a system option which the user can control. The other one is internal, and I cannot discover a way to control it from within Mathematica.

The first one controls when a list is packed automatically as an argument to (certain?) listable functions. By default a list of length 250 or longer is auto-packed. It can be set to n with the following:

SetSystemOptions[
 "PackedArrayOptions" -> {"ListableAutoPackLength" -> n}]

[Updated:} The second threshold causes the bug to occur for packed arrays of length 32 or longer in the OP's input provided there is floating-point overflow followed by underflow. The threshold appears in the "ParallelOptions" system option:

SetSystemOptions["ParallelOptions" -> "VectorVendorLengthThresholds" -> {128, 32, 32}]

It's the first 32 that affects the OP's example. If it is reset so that auto-parallelization is not invoked on the Exp that wraps the OP's example (see the new MWE at the end):

SetSystemOptions["ParallelOptions" -> "VectorVendorLengthThresholds" -> {128, 600, 32}]

I assume it is because a parallelized/vectorized version of Exp in the MKL is called. I believe (I really mean I made a wild guess) that the bug comes from a problem in handling signals from the floating point exceptions, in particular both overflow and underflow. It seems when an underflow occurs after an overflow, it cancels or masks overflow signals from the earlier results in processing the input arrays.

I modified the OP's example. The lengths of the input arrays are each 32, the minimum needed on the WolframCloud machines. The results up to but not including the last are overflows; the last result underflows to 0..

  1. If I do not reset the "ListableAutoPackLength" to less than 32, then no bug.
  2. If I set the "ListableAutoPackLength" to less than 80, then we see the OP's bug.
  3. When I reverse the input arrays and set "ListableAutoPackLength" to less than 32, the underflow occurs first and we don't see the bug.

These were performed with the default settings of "VectorVendorLengthThresholds", so that the threshold stays at 32.


Quit[]

$Version

(* Out[1]= 13.2.0 for Linux x86 (64-bit) (December 12, 2022) *)

No bug:

$Exp[$Times[$X9, $Subtract[$X1, 
    79.65469618540546`], $Divide[-66.89166439433642`, $Divide[
     110.36853933887411`, $X9]]]] /. {$Divide -> Divide, $Exp -> 
   Exp, $Subtract -> Subtract, $Times -> 
   Times, $X1 ->Developer`FromPackedArray[N@Range[80-31,80]], 
   $X9 -> Developer`FromPackedArray[N@Range[80-31,80]]}

General::munfl: Exp[-1339.39] is too small to represent as a normalized machine number; precision may be lost.

(* Out[2]=
{1.40584175992*^19373,..., 3.066335212129*^1075,
 0.}
*)

Bug:

SetSystemOptions["PackedArrayOptions" ->
   {"ListableAutoPackLength" -> 50}];

$Exp[$Times[$X9, $Subtract[$X1, 79.65469618540546`], $Divide[-66.89166439433642, $Divide[ 110.36853933887411, $X9]]]] /. {$Divide -> Divide, $Exp -> Exp, $Subtract -> Subtract, $Times -> Times, $X1 ->DeveloperFromPackedArray[N@Range[80-31,80]], $</span>X9 -&gt; DeveloperFromPackedArray[N@Range[80-31,80]]}

(* Out[4]=
{Inf,...,Inf, 0.} *)

No bug, but no underflow warning:

$Exp[$Times[$X9, $Subtract[$X1, 
    79.65469618540546`], $Divide[-66.89166439433642`, $Divide[
     110.36853933887411`, $X9]]]] /. {$Divide -> Divide, $Exp -> 
   Exp, $Subtract -> Subtract, $Times -> 
   Times, $X1 ->Developer`FromPackedArray[N@Range[80-31,80]//Reverse], 
   $X9 -> Developer`FromPackedArray[N@Range[80-31,80]//Reverse]}

(* Out[5]= {0., 3.066335212129^1075,...,1.40584175992^19373} *)

It seems there's problem with signaling of floating-point exceptions in vectorized evaluation. Somehow, though, in this case, Mathematica knew that there were machine infinities (Inf` ) that needed to be recalculated with arbitrary precision.


Update: MWE

Here's a fairly minimal example (again on Linux/WolframCloud):

Exp[-100 Range[-21.,10.]]
(*
{Inf`, <<12>>, Inf`,
  1.01423*^304, <<13>>, 9.85968*^-305,
  0.,0.,0.}
*)
Michael E2
  • 235,386
  • 17
  • 334
  • 747
  • Thanks Michael, this is very helpful. So the workaround is to either shut down auto packing via 'ListableAutoPackLength' or to Reverse the inputs, is that right? I'm not sure the latter solution is very practical though as it must certainly be data-dependent, is that right? (How did you come to discover the Reverse solution, anyway!?) – berniethejet Mar 27 '23 at 10:13
  • 1
    @berniethejet Another alternative workaround should be to make everything arbitrary precision. As for Reverse, it works here because an overflow occurs after an underflow. I would expect that if there were underflows at the beginning and at the end, then Reverse would not fix the bug. I thought of Reverse because the idea that multiple signals from multiple exceptions were being mishandled, and I wanted to see if order matters. – Michael E2 Mar 27 '23 at 11:32
  • Thanks @Michael, that is interesting. I assume the arbitrary precision solution will not work in my case because it slows things down a great deal. This is for the evaluation of the fits of a genetic algorithm and I imagine that arbitrary precision will be an order of magnitude slower (but I haven't tried it). – berniethejet Mar 27 '23 at 16:12
  • 1
    @berniethejet Perhaps result/.x_Real/;Abs[x]>$MaxMachineNumber:>DirectedInfinity[Sign[x]] would be helpful. Or WithCleanup[setoptions, code, resetoptions]. -- Note avoiding the bug ends up using arbitrary precision anyway. You could use SetPrecision to use arbitrary precision on selected parts of the computation. Another approach, which may or may not work, is to work with the logarithm of the quantity. (It seems the last Exp is the problem in the example.) – Michael E2 Mar 27 '23 at 16:26
  • 1
    @berniethejet I updated my explanation. I don't know where the initial apparent threshold of length >= 80 comes from. Probably it was my fault. If I play with the system parameters, I can control that threshold. – Michael E2 Mar 27 '23 at 17:09
  • Thanks Michael, I have taken this as the accepted answer. Your MWE facilitates the easy implementation of a workaround, for my use-case, for this sad bug: infBugObject=First[Exp[-100 Range[-21.,10.]]]; dodgyResultsWithInfInIt = dodgyResultsWithInfInIt /. infBugObject->Infinity. – berniethejet Mar 27 '23 at 17:39
2

Convert the Trace of your expression into a String

trs = ToString[Trace[... ..]];

pos = StringPosition[trs, "Inf"];

As you see, the |Esc| inf |Esc| input of [Infintity] in the notebook is copied by Ctrl+C as "Inf"

A strange pattern occurs at the end of the table. at 164000. What is more confusing, the fine tune variable m runs havoc despite Hold and ToString. There seems to be a mysterious superstring at work in the interpreter, that cannot be inactivated.

Manipulate[
 Hold @@ {Quiet[Unevaluated[StringTake[trs, {n + m, n + m + 400}]]]}, {m, 1, 
  100}, {{n, 164000}, 1, StringLength[trs] - 200}, ControlPlacement -> Bottom]
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center. – Community Mar 26 '23 at 13:53
  • Thanks @Roland. It seems to be some deep hard to find bug. I'm just surprised it has never been discovered before. – berniethejet Mar 26 '23 at 19:30
  • 1
    @berniethejet I think I've seen it before, but it would have been on an Intel cpu, which I no longer have. That's how I figured it out on linux. The circumstances that cause it may be different. Did you try my suggestion? This answer verges on nonsense as far as I can tell, which is not very far since I can't test it on Windows. At best it would seem to give a complicated way of seeing what we already know from what you posted in the question. – Michael E2 Mar 26 '23 at 21:13
2

Adding to Michael's answer:

Inf` is not a symbol. Inf` or NaN` are printed when a machine precision infinity or NaN are present in a packed array. Generally, this should not happen, as Mathematica will not work properly with such values. See here for some more information: Passing back "NaN`" and "Inf`" to C via MathLink If manage to produce Inf` values without using the LibraryLink or WSTP C APIs, that's almost certainly a bug.

Szabolcs
  • 234,956
  • 30
  • 623
  • 1,263
  • Thanks Szabolcs. If this Inf' is not a symbol then what is it? I understand that it isn't any sort of official symbol, and I gather that it is some C-side code/glyph/string that has slipped past MMA's processing back to the front end where it manifests as a symbol, no? Or does the " " imbue it with additional properties? But the attaching of the " " certainly makes it impossible to operate on... – berniethejet Mar 27 '23 at 10:26
  • 2
    @berniethejet The Head of an Inf` is Real, and Developer`MachineRealQ on it returns True. So as Szabolcs said, it's a floating-point infinity. The backtick is the mark added to a machine-real number, which is what I assume it means here. However, if you multiply it by 2., you get 0., which is not IEEE 754 compliant. – Michael E2 Mar 27 '23 at 11:43
  • Ah yes, I see, it is indeed Real. I had tried copying and pasting the Inf` to another cell and FullForm-ing it and so on, with no luck - it isn't an allowed expression that can even be evaluated. But if one Maps Head over the output of the offending expression then it is indeed Real. So this is also a matter of there being a one-way interpretation of the object, which then suggests another workaround where one somehow replaces 'Inf' with 'Missing[]', no? Or perhaps this is the gist of Szabolcs' link, that there is no way to operate on 'Inf'? – berniethejet Mar 27 '23 at 15:13
  • My immediate concern is getting my vectors with this dodgy object in it to be usable in some fashion - i.e. for calculating errors and correlations and so on. If I can at least identify these errant Infs and ignore them then I am still better off than where I am now where they are screwing up subsequent calculations. Clip and Round both render the Infs into something well behaved, anyway. Chop, Threshold, N and Abs, for example, do not. – berniethejet Mar 27 '23 at 15:28
  • As a workaround, it is possible to just take the first element of the errant output and use that as a replacement rule for subsequent operations (infObj=First@errantOutput; errantOutput/.infObj->Infinity). But perhaps there is a more canonical method of generating this weird 'infObj' (like in Szabolcs' link: 'inf = getInf[] (* MathLink-based function that returns "Inf" *)') But Szabolcs doesn't mention if there is any actualgetInf[]` function. – berniethejet Mar 27 '23 at 16:28
  • 1
    "had tried copying and pasting the Inf` to another cell and FullForm-ing it and so on, with no luck" That's what I mean by "not a symbol", and "should not be possible to create this value". – Szabolcs Mar 27 '23 at 18:02
  • 1
    If you explicitly unpack the packed array (Developer`FromPackedArray), it becomes a proper Infinity symbol, but the array will take up much more memory. This is what I currently do in IGraph/M, where I do get infinities and NaN from C code. – Szabolcs Mar 27 '23 at 18:03
  • 1
    "Or perhaps this is the gist of Szabolcs' link, that there is no way to operate on 'Inf'?" You can operate on it but the results will sometimes be wrong or inconsistent. Mathematica's functions are not prepared to handle machine precision infinities and NaNs. So you shouldn't, if you want reliable results. I wouldn't be surprised if some functions even crashed when given these values. But the fact that you are able to produce these values indicates a bug in Mathematica. This should not be possible at all. – Szabolcs Mar 27 '23 at 18:04