Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

Почему изменение параметра шаблона при вызове функции даёт неверный результат?

22.09.2018, 03:53. Показов 1511. Ответов 8

Студворк — интернет-сервис помощи студентам
Есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc.hpp>
 
    #include <iostream>
 
 
    int main(int argc, char** argv) {
 
        cv::Mat points4d = (cv::Mat_<float>(4, 1)
            << -0.16131888, 0.083065912, 0.44372728, 0.87760037);
 
        std::cout << points4d << std::endl;
 
        for (int i = 0, cols = points4d.cols; i < cols; i++) {
 
            std::cout << "points4d.at<float>(0, i): " << points4d.at<float>(0, i) << std::endl;
            std::cout << "points4d.at<float>(1, i): " << points4d.at<float>(1, i) << std::endl;
            std::cout << "points4d.at<float>(2, i): " << points4d.at<float>(2, i) << std::endl;
            std::cout << "points4d.at<float>(0, i) / points4d.at<float>(3, i): "
                      << points4d.at<float>(0, i) / points4d.at<float>(3, i) << std::endl;
            std::cout << "points4d.at<float>(1, i) / points4d.at<float>(3, i): "
                      << points4d.at<float>(1, i) / points4d.at<float>(3, i) << std::endl;
            std::cout << "points4d.at<float>(2, i) / points4d.at<float>(3, i): "
                      << points4d.at<float>(2, i) / points4d.at<float>(3, i) << std::endl;
 
            std::cout << "points4d.at<double>(0, i): " << points4d.at<double>(0, i) << std::endl;
            std::cout << "points4d.at<double>(1, i): " << points4d.at<double>(1, i) << std::endl;
            std::cout << "points4d.at<double>(2, i): " << points4d.at<double>(2, i) << std::endl;
            std::cout << "points4d.at<double>(0, i) / points4d.at<double>(3, i): "
                              << points4d.at<double>(0, i) / points4d.at<double>(3, i) << std::endl;
            std::cout << "points4d.at<double>(1, i) / points4d.at<double>(3, i): "
                              << points4d.at<double>(1, i) / points4d.at<double>(3, i) << std::endl;
            std::cout << "points4d.at<double>(2, i) / points4d.at<double>(3, i): "
                              << points4d.at<double>(2, i) / points4d.at<double>(3, i) << std::endl;
 
        }
    }
При вызове печатается следующее (для примера points4d содержит одну точку (массив 1х4)):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [-0.16131888;
     0.083065912;
     0.44372728;
     0.87760037]
    points4d.at<float>(0, i): -0.161319
    points4d.at<float>(1, i): 0.0830659
    points4d.at<float>(2, i): 0.443727
    points4d.at<float>(0, i) / points4d.at<float>(3, i): -0.183818
    points4d.at<float>(1, i) / points4d.at<float>(3, i): 0.0946512
    points4d.at<float>(2, i) / points4d.at<float>(3, i): 0.505614
    points4d.at<double>(0, i): 1.18775e-11
    points4d.at<double>(1, i): 9.14973e-06
    points4d.at<double>(2, i): 0.00203439
    points4d.at<double>(0, i) / points4d.at<double>(3, i): inf
    points4d.at<double>(1, i) / points4d.at<double>(3, i): inf
    points4d.at<double>(2, i) / points4d.at<double>(3, i): inf
`Mat_<float>` : исходник класса можно глянуть тут.
Откуда разница в печати `points4d.at<double>` между `points4d.at<float>`?

Code
1
2
gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
OpenCV version is 3.4.3
Опции компиляции:
C++
1
-Wall -Wextra -pedantic -std=c++17
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2018, 03:53
Ответы с готовыми решениями:

Неверный тип параметра при вызове функции write потока ofstream
error C2664: std::basic_ostream&lt;_Elem,_Traits&gt;::write: невозможно преобразовать параметр 1 из 'char' в 'const char *' #include...

Программа дает неверный результат при вычислениях
Проблема в том, что программа считает неправильно, я считал с калькулятора и по формулам excel, и результат отличается от того что выдает...

Возвратить тип шаблона,так чтобы результат при вызове присваивался объекту
Есть матрица,нужно создать новую матрицу и &quot;перевернуть&quot; (т.е. столбцы становятся строками,а строки-стобцами)-это сделано. Потом нужно...

8
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
22.09.2018, 14:45
Лучший ответ Сообщение было отмечено #pragma как решение

Решение

Цитата Сообщение от #pragma Посмотреть сообщение
Откуда разница в печати `points4d.at<double>` между `points4d.at<float>`?
double в 2 раза больше float. В матрице у вас хранятся float, которые вы читаете как double. Как минимум выходите за границу массива.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 15:24
DrOffset,
А где написано что double в два раза больше float?)
Я вот в стандарте искал но не нашёл.
Нагуглил что про double в стандарте с++ вообще ничего нет
Но компиляторы реализуют его по какому то числовому стандарту где double 8 а float 4 байта...

Что ещё интересно, почему для чисел с плавающей точкой нет специальных типов фиксированного размера как например для целых вроде int32_t и т.д
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
22.09.2018, 16:15
Цитата Сообщение от Undisputed Посмотреть сообщение
А где написано что double в два раза больше float?)
Вот здесь: https://software.intel.com/sit... 64-abi.pdf
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 16:19
DrOffset,
Это же не С++ а документация для конкретной платформы... )
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
22.09.2018, 16:25
Цитата Сообщение от Undisputed Посмотреть сообщение
Это же не С++ а документация для конкретной платформы... )
И что?
Автор же написал:
Цитата Сообщение от #pragma Посмотреть сообщение
gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 16:30
DrOffset,
Наверное мне нужно было уточнить что интересует то как работать с данными если неизвестна емкость типа.
С int-ами еще понятно, можно использовать фиксированные типы вроде int32_t.
А вот что делать с double и float не понятно... По моим наблюдениям как правило float 4 байта а double 8.
Но гарантий таких я не нашел. В итоге где то вычисления могут происходить не правильно потому что на определенной платформе
размер используемого типа меньше чем это бывает обычно...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
22.09.2018, 16:36
Цитата Сообщение от Undisputed Посмотреть сообщение
А вот что делать с double и float не понятно...
Использовать самостоятельно написанные решения или библиотечные. Например вот: https://www.boost.org/doc/libs... pdefs.html
В C++ были предложения, например вот: http://www.open-std.org/jtc1/s... /n1703.pdf

Цитата Сообщение от Undisputed Посмотреть сообщение
В итоге где то вычисления могут происходить не правильно потому что на определенной платформе размер используемого типа меньше чем это бывает обычно...
Если ты пишешь под такие платформы, то наверняка уж сумеешь разобраться как написать код так, чтобы это не было проблемой.
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
22.09.2018, 17:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
double в 2 раза больше float. В матрице у вас хранятся float, которые вы читаете как double. Как минимум выходите за границу массива.
Точно, совсем вылетело из головы. Но всё рано странно, что числа все как один стремятся к нулю, по идее должны быть некие случайные числа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2018, 17:35
Помогаю со студенческими работами здесь

Почему выводит неверный результат при вычислении произведения?
Еще 1 вопрос из разряда нубских: #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; int main() { setlocale(0,...

ChildWindowFromPoint даёт неверный результат
Есть WinForms приложение. В основном окне вызывается дочернее вот таким кодом:new RecordForm().ShowDialog(this);В этом дочернем окне...

Почему при поиске остатка числа выдает неверный результат?
Добрый вечер. Не могу понять в чем проблема. Нужно найти моду числа: double res2 = (Math.Pow(x, (n - 1) / 2)); ...

Вычисление по формуле даёт неверный результат
#include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;cstdlib&gt; double ad,bd; float af,bf; using namespace std; int main() ...

Сравнение строк даёт неверный результат
Ткните, пожалуйста, что я делаю не так? Только начал изучать ООП. Как бы я не пытался, но в классе такого вида: class Друг :...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru